Mysql 为什么这个左外连接会产生错误的结果?

Mysql 为什么这个左外连接会产生错误的结果?,mysql,sql,join,left-join,outer-join,Mysql,Sql,Join,Left Join,Outer Join,我对外部连接上的以下SQL(可能很简单)感到困惑 我有两个小表格emp和deptno,即有员工及其部门的记录。它们的关系显然是1-N(但这是不相关的)。 我正在尝试使用外部联接查找没有员工在那里工作的部门号。因此我认为正确的解决方案是外部联接 如果我这样做: select d.deptno as d_deptno, e.deptno as e_deptno from dept d left outer join emp e on d.deptno = e.deptno; 我得

我对
外部连接
上的以下SQL(可能很简单)感到困惑
我有两个小表格
emp
deptno
,即有员工及其部门的记录。它们的关系显然是
1-N
(但这是不相关的)。
我正在尝试使用外部联接查找没有员工在那里工作的部门号。因此我认为正确的解决方案是
外部联接

如果我这样做:

select d.deptno as d_deptno, e.deptno as e_deptno  
from dept d left outer join  emp e  
on d.deptno = e.deptno;    
我得到:

d_deptno    e_deptno  
10,         10  
10,         10  
10,         10  
20,         20  
20,         20  
20,         20  
20,         20  
20,         20   
30,         30  
30,         30  
30,         30   
30,         30  
30,         30  
30,         30  
40,         null    
好的,我想我需要的只是最后一行,所以我只需要修改我的查询,如下所示:

select d.deptno as d_deptno, e.deptno as e_deptno  
from dept d left outer join  emp e  
on d.deptno = e.deptno and e.deptno is null;  
也就是说,我添加了
,而e.deptno为null
。出于某种原因,如果我执行了
e_deptno为null
则无法解析查询(为什么?
但我得到的结果如下

d_deptno  e_deptno  
10,       null   
20,       null   
30,       null   
40,       null   

为什么我会得到这些结果?我对
外部联接
s有什么误解?

条件
e.deptno为空
需要在
where
子句中:

select d.deptno as d_deptno, e.deptno as e_deptno  
from dept d left outer join  emp e  
on d.deptno = e.deptno 
where e.deptno is null
这是因为
on
子句使用指定为条件的条件将行从一个表连接到另一个表-因此它将只链接到具有空
deptno
emp
记录,同时链接到与
deptno
记录匹配的
deptno

由于这些条件是互斥的,因此查询永远不会成功链接到
emp
记录,因此外部联接确保为
emp
值返回空值

where
子句在连接条件之后应用,因此将
为null
条件移动到
where
子句中可确保仅选择不匹配
emp
记录的
dept
记录


e_deptno为null
在本查询中在
on
子句或
where
子句中无效,因为
e_deptno
仅在select子句中定义(在
on
之后,
where
和任何分组应用后)-它可能在having子句中有效(在MySQL中),但是。

那么,我在……和
上的
版本有什么作用呢?还有任何关于为什么
e_deptno
不被接受为查询的一部分的想法吗?+1
所以它只会链接到deptno为空的emp记录,同时deptno与dept记录匹配
你是说
emp
中的记录与
e.deptno
匹配,而emp记录的deptno
null
对吗?@Jim:我的意思是为了匹配,每个
emp
记录的
deptno
值必须同时为null,并与
dept
记录的值相匹配。您应该在where子句
中添加第二个条件,其中e.deptno也为null
,您不能在where条件下使用别名。@chetan:所以我不能在and或etc上加入
?是的,您可以在。。而且。。。或等等。如果您有多个连接条件,但您应该在where子句中添加文字比较(警告:long)答案:,特别是粗体部分,它说:“我的观点是,这些空值是在左外部连接期间创建的(在结果集中)。”您在第1个查询的结果中看到的空值,行:
40,null
由外部联接生成。它不在桌子上。