• 一起学习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
    
    
    • 1
    • 2

    查询的结果数据如下:

    图片

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

    图片

    2.LEFT JOIN

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

    SELECT * FROM user LEFT JOIN t_user ON user.username = t_user.username
    
    
    • 1
    • 2

    查询的结果如下:

    图片

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

    SELECT * FROM t_user LEFT JOIN user ON user.username = t_user.username
    
    
    • 1
    • 2

    图片

    这时候可以总结使用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
    
    
    • 1
    • 2

    图片

    即这里的查询结果是以右表的数据为准,右表的数据全部显示,左表则显示和右表交集部分的数据。可以用下图表示,查询的结果右表的所有值,左表中有匹配的则有值,不匹配的则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
    
    
    • 1
    • 2

    查询结果如下:

    图片

    再看union all:

    SELECT username FROM user UNION all SELECT username FROM t_user
    
    
    • 1
    • 2

    查询结果如下:

    图片

    可以发现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
    
    
    • 1
    • 2

    部分结果如下:

    图片

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

    总结

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

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

    图片

    相关推荐

  • 相关阅读:
    CTPN网络理解
    三菱FX5U PLSV指令-可变速度输出
    【数据结构与算法】一套链表 OJ 带你轻松玩转链表
    【JAVA】浅解线程池ThreadPoolExecutor的各个参数
    SpringBoot 中如何操作事务?
    linux常用命令
    后端统一处理返回前端日期LocalDateTime格式化去T,Long返回前端损失精度问题
    Linux网络编程(四)
    通过Python的speech_recognition库将音频文件转为文字
    ICA、TJA、ACC、ICC
  • 原文地址:https://blog.csdn.net/qq_41153943/article/details/125565202