如果使用where子句,外连接将提供与内连接相同的结果

时间:2013-02-16 11:23:20

标签: mysql sql join left-join inner-join

以下SQL语句:

select * from employees e   
left join departments d on e.deptid = d.deptid   
where ( d.deptname = 'HR' or d.deptname  = 'HR & Accounts')    

生成与以下内部联接相同的结果:

select * from employees e  
   inner join departments d on e.deptid = d.deptid and d.deptname like '%HR%';  

他们以何种方式产生相同的结果。

我的意思是第一个等同的查询,例如of:

  1. 从员工中选择*并使用where
  2. 进行过滤
  3. 离开加入?
  4. 第一个查询的哪些步骤使其与内部联接相同?

2 个答案:

答案 0 :(得分:3)

对于与外部联接条件不匹配的行,联接表中任何列的值都为NULL。在处理连接之后,Where子句发生(概念上),因此测试这些列的任何条件都将为false(或严格地说,为NULL)。

如果要包含一个表中的所有行,但只匹配满足条件的第二个表中的行,则必须将该条件添加到外部联接的ON子句中。

另外请注意,因为内部连接会丢弃没有匹配的行,所以内部连接的ON子句中的条件与在Where子句中的条件具有相同的效果。

答案 1 :(得分:1)

使用第二个查询,您可以在连接条件中进行过滤。

第一个查询将使用deptid将员工加入部门。它返回所有可能的结果,然后使用where子句进行过滤。此过滤基本上改变了查询以返回类似于内部联接查询的结果。

您可以更改第一个查询,以显示它无法返回的内容,因为您的where子句如下:

select *, CASE WHEN d.deptname = 'HR' or d.deptname  = 'HR & Accounts' THEN 1 ELSE 0 END as HR
from employees e 
left join departments d on e.deptid = d.deptid;