请解释一下 mysql left join 行为。我有带有两个表的简单示例数据集:
CREATE TABLE tab1 (
id1 int NOT NULL,
field11 int NOT NULL,
field12 date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
INSERT INTO tab1 (id1, field11, field12) VALUES
(1, 11, '2024-07-10'),
(2, 11, '2024-07-10'),
(3, 11, '2024-07-10'),
(4, 12, '2024-07-11'),
(5, 12, '2024-07-11'),
(6, 12, '2024-07-11');
CREATE TABLE tab2 (
id2 int NOT NULL,
field21 int NOT NULL,
field22 date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
INSERT INTO tab2 (id2, field21, field22) VALUES
(1, 11, '2024-07-01'),
(2, 11, '2024-07-01'),
(3, 11, '2024-07-01'),
(4, 22, '2024-07-02'),
(5, 22, '2024-07-02'),
(6, 22, '2024-07-02');
我有疑问:
select *
from tab1 t1
left join tab2 t2 on t1.field11 = t2.field21;
我得到了以下结果:
+-----+---------+------------+------+---------+------------+
| id1 | field11 | field12 | id2 | field21 | field22 |
+-----+---------+------------+------+---------+------------+
| 1 | 11 | 2024-07-10 | 3 | 11 | 2024-07-01 |
| 1 | 11 | 2024-07-10 | 2 | 11 | 2024-07-01 |
| 1 | 11 | 2024-07-10 | 1 | 11 | 2024-07-01 |
| 2 | 11 | 2024-07-10 | 3 | 11 | 2024-07-01 |
| 2 | 11 | 2024-07-10 | 2 | 11 | 2024-07-01 |
| 2 | 11 | 2024-07-10 | 1 | 11 | 2024-07-01 |
| 3 | 11 | 2024-07-10 | 3 | 11 | 2024-07-01 |
| 3 | 11 | 2024-07-10 | 2 | 11 | 2024-07-01 |
| 3 | 11 | 2024-07-10 | 1 | 11 | 2024-07-01 |
| 4 | 12 | 2024-07-11 | NULL | NULL | NULL |
| 5 | 12 | 2024-07-11 | NULL | NULL | NULL |
| 6 | 12 | 2024-07-11 | NULL | NULL | NULL |
+-----+---------+------------+------+---------+------------+
12 rows in set (0.00 sec)
但我期待以下结果:
+-----+---------+------------+------+---------+------------+
| id1 | field11 | field12 | id2 | field21 | field22 |
+-----+---------+------------+------+---------+------------+
| 1 | 11 | 2024-07-10 | 1 | 11 | 2024-07-01 |
| 2 | 11 | 2024-07-10 | 2 | 11 | 2024-07-01 |
| 3 | 11 | 2024-07-10 | 3 | 11 | 2024-07-01 |
| 4 | 12 | 2024-07-11 | NULL | NULL | NULL |
| 5 | 12 | 2024-07-11 | NULL | NULL | NULL |
| 6 | 12 | 2024-07-11 | NULL | NULL | NULL |
+-----+---------+------------+------+---------+------------+
我的期望基于这个文档(https://www.w3schools.com/mysql/mysql_join_left.asp):
LEFT JOIN 关键字返回左表中的所有记录 (表1),以及右表中的匹配记录(如果有) (表2)。
据我了解,结果数据集中必须仅存在与图片上仅绿色圆圈相对应的记录。
请解释一下左连接是如何工作的。
是的,您是对的,LEFT JOIN 关键字返回左表中的所有记录,以及右表中的匹配记录。 就像您在 't1.field11 = t2.field21' 上执行左连接一样 - 将返回左表 (t1) 中的所有行,并且 tab1 中 field11 = '11' 的行将与 tab2 中 field21 = '11' 的所有行连接。 由于 tab2 中 field21 = 11 有 3 个匹配行,因此 tab1 中 field11 = 11 的每一行都将与这 3 行中的每一行匹配,从而导致多个组合。其余全部将为 NULL。