SQL左连接查询差异

时间:2015-12-30 07:14:12

标签: mysql

enter image description here tblEmployee表左和tblDepartment表右

enter image description here

第一次查询:

Select Name, Gender, Salary, DepartmentName
from tblEmployee
Left Join tblDepartment
On tblEmployee.departmentID = tblDepartment.Id
Where tblEmployee.departmentID IS Null; 

第二次查询:

Select Name, Gender, Salary, DepartmentName
from tblEmployee
Left Join tblDepartment
On tblEmployee.departmentID = tblDepartment.Id
Where tblDepartment.Id IS Null

我上面写的两个查询用于显示第二张图片中的数据(只有两行)。有人可以向我解释为什么上面的查询产生相同的结果吗?我理解为什么第一个查询有效,因为你只是过滤掉了departmentID不等于NULL的所有记录,并选择了departmentID等于NULL的记录。虽然对于第二个查询我不明白where子句背后的想法。它如何过滤出Employee表中那两个为NULL的记录?

3 个答案:

答案 0 :(得分:3)

首先查询:

Select Name, Gender, Salary, DepartmentName
from tblEmployee
Left Join tblDepartment
On tblEmployee.departmentID = tblDepartment.Id
Where tblEmployee.departmentID IS Null; 

将从A和B返回结果,其中A没有departmentId

所以:James和Russell符合描述。

第二次查询:

Select Name, Gender, Salary, DepartmentName
from tblEmployee
Left Join tblDepartment
On tblEmployee.departmentID = tblDepartment.Id
Where tblDepartment.Id IS Null

将带回A上不存在的结果。

所以:James和Russell符合描述。

SQL JOINS CheatSheet

答案 1 :(得分:2)

第一个查询将为您提供结果,其中employee表具有结果,但将departmentid作为空值。

第二个查询将为您提供employee表中所有记录的结果,这些记录在department表中不存在。

所以这里两个查询都会提供相同的结果。

即使您可以从没有加入的单个表中获得相同的结果,因为您试图仅获取部门不匹配的那些记录 -

Select Name, Gender, Salary 
from tblEmployee 
where departmentID IS Null; 

此查询速度很快,不包含部门名称,因为您从未通过此查询获取该部门名称。

答案 2 :(得分:2)

在第二个查询中,tblDepartment.Id对于最后两个记录将为NULL,因为它无法在tblDepartment表中找到相应的记录。 Left Join将返回第一个表中的所有行。如果它无法在连接中找到值,则右表中的列值将替换为NULL。因此,您只获得最后2条记录。