请解释一下mysql left join

问题描述 投票:0回答:1

请解释一下 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)。

enter image description here

据我了解,结果数据集中必须仅存在与图片上仅绿色圆圈相对应的记录。

请解释一下左连接是如何工作的。

mysql join left-join
1个回答
0
投票

是的,您是对的,LEFT JOIN 关键字返回左表中的所有记录,以及右表中的匹配记录。 就像您在 't1.field11 = t2.field21' 上执行左连接一样 - 将返回左表 (t1) 中的所有行,并且 tab1 中 field11 = '11' 的行将与 tab2 中 field21 = '11' 的所有行连接。 由于 tab2 中 field21 = 11 有 3 个匹配行,因此 tab1 中 field11 = 11 的每一行都将与这 3 行中的每一行匹配,从而导致多个组合。其余全部将为 NULL。

© www.soinside.com 2019 - 2024. All rights reserved.