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

MySQL:为什么在左连接中选择空的行,而在x.y上不选择空的行,mysql,null,left-join,Mysql,Null,Left Join,以下是查询: 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 | +----+-------

以下是查询:

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      |
+----+-------+--------+-----------+
正如我的想法一样,这个问题应该向所有雇主说明。具有A.ManagerId=b.Id的一组行

除行外,一切都很好

萨姆,空 最大值,空值

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

是否引用表Employee a的别名 相反,空值被引用到别名表中 雇员b

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

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

在编写查询时,您应该将表行视为数据集,而别名是相同数据的独立集

SELECT x from A
LEFT JOIN B
ON  A.b_id = b.id
选择所有表A并连接到B。但使用所有A

在示例A和B的情况下,表是相同的,但仍然如此。我们有一个表格的完整列表,每行附有或不附有一行B表格

所以,为了减少表的行数,需要使用WARE子句来控制它

正确的查询将是

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
ON子句,用于定义将哪些行附加到表的规则 WARE子句筛选步骤1中的行。换句话说,在本例中,从表中剪切一些行。 当我使用ON FAlSE时:它只选择A中的所有行,而不与B行连接

SELECT a.name as Employee from Employee as a
LEFT JOIN Employee as b
ON false
WHERE 1
乔 亨利 山姆 马克斯 当我使用ON TRUE时,它使用所有A行B次


空是一种奇怪的野兽。这就是为什么。我想你可以参考这里,更清楚地了解连接条件的on和where阶段之间的区别。不是因为NULL,而是因为“ON”是如何工作的ON'根据某种规则给出与B行连接的所有A行。无论如何,答案中将显示所有A行。在筛选行旁边,需要使用“WERE”。在这种情况下,为ON添加一条规则,在ManagerID为NULL的情况下,它没有附加B行,但它不会拒绝这些行。无论您在ON子句中写什么,都将从a获取所有行。这就是左连接的工作原理。更正确的说法是,至少会使用表A中的所有行。如果case ON FALSE,如果case ON TRUE将是A行B次。您能否澄清,左连接ON没有内部或外部前缀-默认情况下是内部还是外部?这三个外部连接上没有内部左/右/完全连接。左/右/完全连接打开即左/右/完全外部连接打开。不带内部连接、左连接、右连接或完全连接的连接为内部连接打开。逗号表示交叉联接,但其优先级低于关键字联接。此外,1=1时的内部/左侧/右侧/完全连接都是交叉连接。MySQL允许无ON的内部连接意味着交叉连接;但这是不标准的。MySQL上没有完整的外部联接。阅读权威性的描述——教科书或书籍。如果我已经发布了以下内容,请原谅:这篇文章的目的是什么?它陈述了很多事情,但是它们与这个问题有什么关系呢?如果此文本只是附加问题,请将其编辑到问题帖子中。此外,这其中的大部分都非常不清楚。另外,它试图说明一些关于操作符调用的事情,但它肯定没有清楚地描述那些操作符是如何工作的。我在前面的评论中犯了一个错误,我说将内部连接转换为外部连接。你没有。在c上有一个左连接b,其中a.ManagerId不为NULL。其中不要求任何b列不为null。WHERE从外部联接中删除具有null a.ManagerId的行。对于该c,在表a的每行输出中将有一行,ManagerId为null。
SELECT a.name as Employee from Employee as a
LEFT JOIN Employee as b
ON false
WHERE 1
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"]]}