MySQL:为什么在左连接中选择带有 NULL 的行,而在 x.y 上不为空



下面是查询:

SELECT a.name as Employee, b.name as Manager from Employee as a
LEFT JOIN Employee as b
ON a.ManagerId = b.Id AND a.ManagerId IS NOT NULL
WHERE 1

它适用于此表:

+----+-------+--------+-----------+
| Id | Name  | Salary | ManagerId |
+----+-------+--------+-----------+
| 1  | Joe   | 70000  | 3         |
| 2  | Henry | 80000  | 4         |
| 3  | Sam   | 60000  | NULL      |
| 4  | Max   | 90000  | NULL      |
+----+-------+--------+-----------+

作为想法,此查询应显示所有雇主。一组具有 .ManagerId = b.Id 的行。

一切都很好用,expt行

Sam, NULLMax, NULL

为什么这些行会返回。如果我在ON子句中设置a.ManagerId is NOT NULL

a.Manager IS NOT NULL 

引用表Employee a的别名 而是将 NULL 值引用到别名表中Employee b

表的别名用作新分隔表所属的相关行

在 sql 中,当您需要原始表中的值用于不同的用途和连接时,这是典型的

您应该将表行视为数据集,别名是相同数据的单独集

编写查询时

SELECT x from A
LEFT JOIN B
ON  A.b_id = b.id

选择所有表 A 并连接到 B。但所有 A 都被使用。

在示例A和B的情况下,表是相同的,但尽管如此。 我们有 A 表的完整列表,其中每行附加或未附加一行 B 表。

因此,要减少A表的行数,需要用WERE CLAUSE来控制它

正确的查询将是

SELECT a.name as Employee, b.name as Manager from Employee as a
LEFT JOIN Employee as b
ON a.ManagerId = b.Id  
WHERE a.ManagerId IS NOT NULL
  1. ON用于定义行附加到表的规则的子句
  2. WERE子句筛选步骤 1 中的行。换句话说,在本例中,从 A 表中"剪切"了一些行。

当我使用ON FAlSE时:它只选择 A 中的所有行,而不与 B 行连接。

SELECT a.name as Employee from Employee as a
LEFT JOIN Employee as b
ON false
WHERE 1
  • 亨利
  • 山 姆
  • 麦克斯

当我使用ON TRUE它使用所有AB次。

SELECT a.name as Employee from Employee as a
LEFT JOIN Employee as b
ON true
WHERE 1
{"headers": ["Employee"], "values": 
[
["Joe"], ["Henry"], ["Sam"], ["Max"], 
["Joe"], ["Henry"], ["Sam"], ["Max"],
["Joe"], ["Henry"], ["Sam"], ["Max"], 
["Joe"], ["Henry"], ["Sam"], ["Max"]]}

相关内容

  • 没有找到相关文章

最新更新