MySQL JOIN 语句
简介:在本教程中,您将学习各种MySQL连接语句来查询来自多个表的数据。
MySQL JOIN语句简介
关系数据库由使用公共列(称为外键列)链接在一起的多个相关表组成。因此,从业务角度来看,每个表中的数据都是不完整的。 例如,在示例数据库中,我们有使用列orderNumber
链接的orders
和 orderdetails
表。
要获得完整订单的数据,需要查询orders
和 orderdetails
两个表的数据。
这就是使用MySQL JOIN
的原因。
MySQL连接是一种基于表之间的公共列的值在一个(自连接)或更多表之间链接数据的方法。
MySQL支持以下类型的连接:
要关联表可以使用CROSS JOIN
,INNER JOIN
,LEFT JOIN
或RIGHT JOIN
语句相应类型的联接。join子句用在子句SELECT
后面的FROM
语句中。
请注:MySQL不支持完全外连接。
为了便于您理解每种类型的连接,我们将使用具有以下结构的t1
和t2
表:
CREATE TABLE t1 ( id INT PRIMARY KEY, pattern VARCHAR(50) NOT NULL ); CREATE TABLE t2 ( id VARCHAR(50) PRIMARY KEY, pattern VARCHAR(50) NOT NULL );两者
t1
和t2
表都有pattern
列,这也是表之间的公共列。
以下语句将数据插入到表t1
和t2
表中:
INSERT INTO t1(id, pattern) VALUES(1,'Divot'), (2,'Brick'), (3,'Grid'); INSERT INTO t2(id, pattern) VALUES('A','Brick'), ('B','Grid'), ('C','Diamond');而下面的图片说明,从两个数据
t1
和t2
表:
-- t1表的数据 +----+---------+ | id | pattern | +----+---------+ | 1 | Divot | | 2 | Brick | | 3 | Grid | +----+---------+ 3 rows in set (0.00 sec) -- t2表的数据 +----+---------+ | id | pattern | +----+---------+ | A | Brick | | B | Grid | | C | Diamond | +----+---------+ 3 rows in set (0.00 sec)
MySQL CROSS JOIN
CROSS JOIN
使得从多个表行笛卡尔积。假设使用CROSS JOIN
连接t1
和t2
表,结果集将包括t1
表中行与 t2
表中行的组合 。
要执行交叉连接,请使用CROSS JOIN
以下语句中的子句:
SELECT t1.id, t2.id FROM t1 CROSS JOIN t2;以下显示了查询的结果集:
+----+----+ | id | id | +----+----+ | 1 | A | | 2 | A | | 3 | A | | 1 | B | | 2 | B | | 3 | B | | 1 | C | | 2 | C | | 3 | C | +----+----+ 9 rows in set (0.00 sec)如您所见,
t1
表中的每一行都与t2
表中的行组合以形成笛卡尔积。
下图说明了CROSS JOIN
两者之间t1
和t2
表格。
MySQL INNER JOIN
要形成一个INNER JOIN
,必需要一个连接字段条件。INNER JOIN
要求两个连接表中的行具有匹配的值。INNER JOIN
返回的记录是通过两表连接字段相同的记录。
要连接两个表,请将 INNER JOIN
第一个表中的每一行与第二个表中的每一行进行比较,以查找满足连接谓词的行对。每当通过匹配非NULL值来满足连接字段时,两个表中每个匹配行对的列值都包含在结果集中。
以下语句使用INNER JOIN
子句连接t1
和t2
表:
SELECT t1.id, t2.id FROM t1 INNER JOIN t2 ON t1.pattern = t2.pattern;在此语句中,以下表达式关联条件:
t1.pattern = t2.pattern这意味着
t1
和t2
表中的行必须在pattern
列中具有相同的值才能包含在结果中。
以下说明了查询的结果:
+----+----+ | id | id | +----+----+ | 2 | A | | 3 | B | +----+----+ 2 rows in set (0.00 sec)下图说明了
INNER JOIN
介于t1
和t2
表之间:
在此图中,两个表中的行必须具有相同的模式才能包含在结果集中。
MySQL LEFT JOIN
与INNER JOIN
类似,LEFT JOIN
也需要连接条件。使用LEFT JOIN
连接两个表时,会引入左表和右表的概念。
与INNER JOIN
不同, LEFT JOIN
返回左表中的所有行,包括满足连接条件行和不满足连接条件的行。对于与条件不匹配的行,NULL将出现在结果集中右表的列中。
以下语句使用LEFT JOIN
子句连接t1
和t2
表:
SELECT t1.id, t2.id FROM t1 LEFT JOIN t2 ON t1.pattern = t2.pattern ORDER BY t1.id;运行结果:
+----+------+ | id | id | +----+------+ | 1 | NULL | | 2 | A | | 3 | B | +----+------+ 3 rows in set (0.00 sec)如您所见,
t1
表中的所有行都包含在结果集中。对于t1
表(左表)中没有表中任何匹配行t2
(右表)的行,NULL用于表中的t2
列。
下图说明了LEFT JOIN
t1和t2表之间的关系:
在此图示中,以下行共享相同的模式:(2和A),(3和B)。t1
表中id为1的行在表中没有匹配的行t2
,因此,NULL
用于t2
结果集中表的列 。
MySQL RIGHT JOIN
RIGHT JOIN
也类似于LEFT JOIN
表格的处理相反的情况。使用 RIGHT JOIN
,右表(t2
)中的每一行都将出现在结果集中。对于右表中没有左表(t1
)中匹配行的行,左表( t1
) 中的列显示NULL。
以下语句连接t1
和t2
表使用RIGHT JOIN
:
SELECT t1.id, t2.id FROM t1 RIGHT JOIN t2 on t1.pattern = t2.pattern ORDER BY t2.id;运行结果:
+------+----+ | id | id | +------+----+ | 2 | A | | 3 | B | | NULL | C | +------+----+ 3 rows in set (0.00 sec)在此结果中,右表(
t2
)中的所有行都显示在结果集中。对于右表(t2
)中左表(t1
)中没有匹配行的行,左表(t1
) 的列显示NULL 。
下图说明了RIGHT JOIN
介于t1
和t2
表之间:
在本教程中,您学习了各种MySQL连接语句,包括交叉连接,内连接,左连接和右连接,以查询来自两个或多个表的数据。