当前位置:网站首页>一起学习SQL中各种join以及它们的区别
一起学习SQL中各种join以及它们的区别
2022-07-02 06:10:00 【江夏、】
作者的其他平台:
| CSDN:blog.csdn.net/qq_41153943
| 知乎: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表示。
最后网上有张图能够很好的表示这几种连接的关系,如下图:
相关推荐
边栏推荐
猜你喜欢
500. Keyboard line
BGP中的状态机
State machine in BGP
Current situation analysis of Devops and noops
Google Play Academy 组队 PK 赛,正式开赛!
Leverage Google cloud infrastructure and landing area to build enterprise level cloud native excellent operation capability
Lucene Basics
Browser principle mind map
Flutter 混合开发: 开发一个简单的快速启动框架 | 开发者说·DTalk
谷歌出海创业加速器报名倒计时 3 天,创业人闯关指南提前收藏!
随机推荐
Monitoring uplink of VRRP
来自读者们的 I/O 观后感|有奖征集获奖名单
Linkage between esp8266 and stc8h8k single chip microcomputer - Weather Clock
Shenji Bailian 3.53-kruskal
Generic classes and parameterized classes of SystemVerilog
复杂 json数据 js前台解析 详细步骤《案例:一》
Current situation analysis of Devops and noops
LeetCode 40. 组合总和 II
LeetCode 27. Removing Elements
VLAN experiment of switching technology
Don't use the new WP collection. Don't use WordPress collection without update
Scheme and implementation of automatic renewal of token expiration
Web page user step-by-step operation guide plug-in driver js
Contest3147 - game 38 of 2021 Freshmen's personal training match_ G: Flower bed
如何使用MITMPROXy
Arduino Wire 库使用
Replace Django database with MySQL (attributeerror: 'STR' object has no attribute 'decode')
神机百炼3.53-Kruskal
Pbootcms collection and warehousing tutorial quick collection release
穀歌出海創業加速器報名倒計時 3 天,創業人闖關指南提前收藏!