【问题标题】:SQL Left Join Queries DifferenceSQL左连接查询的区别
【发布时间】:2015-12-30 07:14:12
【问题描述】:

tblEmployee 表左和 tblDepartment 表右

第一个查询:

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

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

【问题讨论】:

  • 您发布的两个查询似乎完全相同。所以同样的结果。可能您必须再次编辑问题,发布正确的第二个查询
  • @parishodak 抱歉。刚刚更新了问题!
  • 嗯不知道为什么它删除了表名称之前的所有 tbl。我也刚刚添加了它们。
  • 这两个查询似乎是一样的:您是否在其中一个中漏掉了一个“NOT”?
  • @genespos 两个查询中的 where 子句不同。这就是我难以理解的。这两个 where 子句如何产生相同的结果或我用两行发布的第二张图片。

标签: mysql


【解决方案1】:

第一次查询:

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

将带回 A 和 B 的结果,其中 A 没有部门 ID

所以:詹姆斯和拉塞尔符合描述。

第二次查询:

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

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

所以:詹姆斯和拉塞尔符合描述。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 快速提问。我不认为我完全理解 On 子句的作用。当您说 On tblEmployee.departmentID = tblDepartment.Id 时,该 SQL 代码是否会查看 departmentID 列和 ID 中每一行的值并检查它们是否匹配?如果他们不这样做,会发生什么?
    • On tblEmployee.departmentID = tblDepartment.Id tblEmployee 中每条记录的部门 ID 将与 tblDepartment 中每条记录的 Id 值进行比较。如果它们匹配,则它们被加入。如果未找到匹配项,则将右表中的列中的值替换为 NULL。
    • 哦!现在这是有道理的。感谢您清除此问题!
    • 当记录被连接时,SQL 知道从连接的记录中选择 DepartmentName,因为我在 Select 语句中指定正确?
    • 'DepartmentName' 取自 tblDepartment,因为只有一个表具有该名称的列,因此它并不模棱两可。当 2 个或更多表的列具有完全相同的名称时,就会出现歧义。在这里,由于“DepartmentName”列没有歧义,因此取自 tblDepartment。
    【解决方案3】:

    第一个查询将为您提供员工表有结果但部门 ID 为空值的结果。

    第二次查询将为您提供员工表中不存在于部门表中的所有记录的结果。

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

    即使您尝试仅获取部门不匹配的那些记录,也可以在不连接的情况下从单个表中获得相同的结果-

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

    此查询将很快,不包括部门名称,因为您永远不会通过此查询获得它。

    【讨论】:

    • 好吧,这也回答了我的第二个问题。我正在关注的教程是使用连接来完成的,但我是按照你不使用连接的方式完成的,而且效果也很好。
    猜你喜欢
    • 2021-12-25
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多