一起学习SQL中各种join以及它们的区别

作者的其他平台:

| CSDN:blog.csdn.net/qq_41153943

| 掘金:juejin.cn/user/651387…

| 知乎:www.zhihu.com/people/1024…

| GitHub:github.com/JiangXia-10…

本文一共2215字,预计阅读610分钟‍

前言

我们在写sql语句的时候,最痛苦的就是涉及到多张表的联合查询,尤其是各种表的各种链接,什么inner join、left join、right join、union、union all,一看到这个也许就会犯迷糊。

今天这篇文章就好好学习整理下,这些各种的join它们到底是啥意思,之间有什么区别。

正文

首先假设我们有两张表。Table user 是左边的表。Table t_user 是右边的表。其各有一定的记录,其中有两条记录username是相同的,如下所示:让我们看看不同JOIN的使用具体有什么不同:

user表:

图片

t_user表:

图片

1.INNER JOIN

先来看看inner join,这个也是使用的比较多的,我们执行下面的语句,将左表和右表使用inner join进行联合查询:

SELECT * FROM user INNER JOIN t_user ON user.username = t_user.username

查询的结果数据如下:

图片

可以发现查询的结果是左表和右表关联字段相同的交集。即查询结果为下图重合部分的数据。

图片

2.LEFT JOIN

left join 也是日常开发中使用的比较多的联合查询方式之一了。同样还是先看例子再讨论结果,执行下述的语句:

SELECT * FROM user LEFT JOIN t_user ON user.username = t_user.username

查询的结果如下:

图片

这时候如果将左表右表换一下结果是如何呢?

SELECT * FROM t_user LEFT JOIN user ON user.username = t_user.username

图片

这时候可以总结使用left join查询的结果就是以左表为准,左表的数据全部查询,而右表的数据则只显示匹配的数据,不匹配的数据为null。这里是左.username=右.username,所以这里显示的右表的数据是右表中username和左表中username相等的数据,不相等的部分的右表则为空。可以用下图表示,查询的结果就是红色标记的阴影部分,即左表的所有数据和右表中和左表重合部分的数据。

图片

3.RIGHT JOIN

其实right join 和left join很像,查询的结果是相反的。

执行下面的语句:

SELECT * FROM user RIGHT JOIN t_user ON user.username = t_user.username

图片

即这里的查询结果是以右表的数据为准,右表的数据全部显示,左表则显示和右表交集部分的数据。可以用下图表示,查询的结果右表的所有值,左表中有匹配的则有值,不匹配的则null表示,和left join 相反!

图片

4.UNION 与 UNION ALL

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。但是,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。UNION 只选取记录,而UNION ALL会列出所有记录。

先看union:

SELECT username FROM user UNION SELECT username FROM t_user

查询结果如下:

图片

再看union all:

SELECT username FROM user UNION all SELECT username FROM t_user

查询结果如下:

图片

可以发现union和union all相比,union少了两条数据,就是user表和t_user表重复的数据,所以union选取的记录会进行筛选,删除重复的数据,而union all则会选取所有的数据。

union可以表示如下:

图片

union all 表示如下:

图片

5.CROSS JOIN

cross join即交叉连接,又称笛卡尔连接(cartersian join)或叉乘(product),如果A和B是两个集合,它们的交叉连接就标记为:A*B,比如执行下述语句:

SELECT * FROM user a CROSS JOIN t_user b

部分结果如下:

图片

可以看到产生的结果集为两个表各自个数的乘积,通常在实际操作中要避免这种操作。

总结

以上就是sql语句中的一些连接查询以及它们之间的区别,另外还有一种full join 表示全连接,但是mysql中不支持,可以使用左连接和右连接的合集进行表示。full join 表示的是左表和右表的并集,但是对于没有匹配的记录,则会以null表示。

最后网上有张图能够很好的表示这几种连接的关系,如下图:

图片

相关推荐


版权声明:本文为qq_41153943原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。