许久以来,在写表的左联接条件的时候,似乎已彻底习惯了在右表上设置联接条件。今天意外发现居然也可以在左表上设置,而且顺势借用到了需求实践中。
重新翻看下官方文档的说明,暂且也算温故而知新了。
联接类型
INNER
指定返回所有匹配的行对。 放弃两个表中不匹配的行。 如果未指定任何联接类型,此设置为默认设置。
FULL [ OUTER ]
指定在结果集中包括左表或右表中不满足联接条件的行,并将对应于另一个表的输出列设为 NULL。 这是对通常由 INNER JOIN 返回的所有行的补充。
LEFT [ OUTER ]
指定在结果集中包括左表中所有不满足联接条件的行,除了由内部联接返回所有的行之外,还将另外一个表的输出列设置为 NULL。
RIGHT [OUTER]
指定在结果集中包括右表中所有不满足联接条件的行,除了由内部联接返回所有的行之外,还将与另外一个表对应的输出列设置为 NULL。
参考网址
https://docs.microsoft.com/zh-cn/sql/t-sql/queries/from-transact-sql?view=sql-server-ver15
下边通过实际使用样例,来重新认识下它们的区别。
测试源表数据预览,三行两列。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191121111832871.png)
1、对左表设置额外的联接条件
首先在左表限定额外的联接条件a.col2=3。这就确定了在左表中只有 id与右表相同、且左表col2=3的记录,会与右表进行联接。左表另外的记录,则会联接失败,右表输出时,会以NULL替代。
select a.* ,b.*
from tb1 a
left join tb1 b on a.id=b.id and a.col2=3
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191121110647789.png)
2、对右表设置额外的联接条件
修改额外的联接条件,这里移到右边。理解起来的意义与第一种方式不一样,但在本例中的结果却是一致的。
select a.* ,b.*
from tb1 a
left join tb1 b on a.id=b.id and b.col2=3
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191121110715996.png)
3、不设置额外的联接条件
很明显,这里显示的就是全集了。
select a.* ,b.*
from tb1 a
left join tb1 b on a.id=b.id
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191121110736721.png)
4、表联接后设置过滤条件
再将额外的联接条件从on移到where后。这里发现得到的数据集变少,明显与前者不一致。这是因为在里表示过滤条件了。
select a.* ,b.*
from tb1 a
left join tb1 b on a.id=b.id
where a.id=4
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191121110803441.png)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)