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 JOINt1和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连接语句,包括交叉连接,内连接,左连接和右连接,以查询来自两个或多个表的数据。
