以下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%';
它们以何种方式产生相同的结果 .
我的意思是第一个查询等效,例如的:
-
从员工中选择*并使用where过滤
-
离开加入?
第一个查询的哪些步骤使其与内部联接相同?
2 回答
使用第二个查询,您可以在连接条件中进行过滤 .
第一个查询将使用deptid将员工连接到部门 . 它返回所有可能的结果,然后使用where子句进行过滤 . 此过滤基本上改变了查询以返回类似于内部联接查询的结果 .
您可以更改第一个查询,以显示它无法返回的内容,因为您的where子句如下:
对于与外部联接的条件不匹配的行,联接表中任何列的值都为NULL . Where子句在处理连接后发生(概念上),因此测试这些列的任何条件都将为false(或严格地说,为NULL) .
如果要包含一个表中的所有行,但只匹配满足条件的第二个表中的行,则必须将该条件添加到外部联接的ON子句中 .
另请注意,因为内部联接会丢弃没有匹配的行,所以内部联接的ON子句中的条件与在Where子句中的条件具有相同的效果 .