当前位置:网站首页>一起学习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表示。
最后网上有张图能够很好的表示这几种连接的关系,如下图:

相关推荐
边栏推荐
- LeetCode 39. Combined sum
- 队列(线性结构)
- Redis key value database [advanced]
- It is said that Kwai will pay for the Tiktok super fast version of the video? How can you miss this opportunity to collect wool?
- IPv6 experiment and summary
- Keepalived installation, use and quick start
- I/o multiplexing & event driven yyds dry inventory
- 谷歌出海创业加速器报名倒计时 3 天,创业人闯关指南提前收藏!
- BGP报文详细解释
- Don't use the new WP collection. Don't use WordPress collection without update
猜你喜欢

Contest3147 - game 38 of 2021 Freshmen's personal training match_ 1: Maximum palindromes

数据回放伴侣Rviz+plotjuggler

Introduce uview into uni app

日期时间API详解

深入学习JVM底层(三):垃圾回收器与内存分配策略

Ti millimeter wave radar learning (I)

神机百炼3.54-染色法判定二分图

深入学习JVM底层(二):HotSpot虚拟机对象

Detailed explanation of BGP message

Shenji Bailian 3.54-dichotomy of dyeing judgment
随机推荐
The real definition of open source software
线性dp(拆分篇)
LeetCode 83. Delete duplicate elements in the sorting linked list
Google Play Academy 组队 PK 赛,正式开赛!
稀疏数组(非线性结构)
Talking about MySQL database
Lambda expressions and method references
官方零基础入门 Jetpack Compose 的中文课程来啦!
Comment utiliser mitmproxy
CNN visualization technology -- detailed explanation of cam & grad cam and concise implementation of pytorch
Contest3147 - game 38 of 2021 Freshmen's personal training match_ G: Flower bed
LeetCode 47. Full arrangement II
Ros2 --- lifecycle node summary
Picture clipping plug-in cropper js
Pbootcms collection and warehousing tutorial quick collection release
如何使用MITMPROXy
Servlet web XML configuration details (3.0)
Database learning summary 5
Unity shader learning notes (3) URP rendering pipeline shaded PBR shader template (ASE optimized version)
LeetCode 283. Move zero