一、前言
????????讲到SQL JOIN,大家一定多次见到过下面这张图片。这张图直观地展示了各种连接结果集的组成,但于我个人而言,来带来了诸多误解,主要是结果集数量方面。本篇博客也主要围绕这张图片来展开,谈谈我对SQL JOIN的梳理(主要是MySQL)。
?上图中,两集合的交集(中间部分)表示符合连接条件的数据,两边表示各自不符合连接条件的数据。
测试使用的表结构和数据如下:
class_info:班级信息表
students:学生表
二、关于JOIN
????????在学习数据库系统概论课程的时候,就有学到内连接、外连接、自然连接、等值连接等概念和分类,在开发过程中使用 left join、right join 等就是这些概念的实现。
2.1、自然连接
说明:不使用?JOIN ON?关键字,将任意两张(多张)表直接进行笛卡尔积输出。
结果集:两张(多张)表的笛卡尔积组合。
结果集数量:两张(多张)表的数量的乘积。
2.2、INNER JOIN
说明:筛选出符合连接条件的进行笛卡尔积。
结果集:两表交集。
结果集数量:两表符合连接条件的乘积?。
2.3、LEFT JOIN
说明:左表为主,右表为条件。先筛选出符合连接条件的进行笛卡尔积,然后保留左表中没有进行连接的数据。
结果集:左表集合。
结果集数量:两表符合连接条件的乘积?+ 左表没有进行连接的数量。
2.4、RIGHT JOIN
说明:右表为主,左表为条件。先筛选出符合连接条件的进行笛卡尔积,然后保留右表中没有进行连接的数据。
结果集:右表集合。
结果集数量:两表符合连接条件的乘积?+ 右表没有进行连接的数量。
2.5、FULL JOIN
说明:MySQL不支持FULL JOIN,不过可以通过UNION关键字来合并LEFT JOIN 与 RIGHT JOIN来模拟FULL JOIN的效果。
结果集:两张表的并集。
结果集数量:两表符合连接条件的乘积?+ 两表中各自没有进行连接的数量。
select * from students t1 full join class_info t2 on t1.class_id = t2.id
> 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'full join class_info t2 on t1.class_id = t2.id' at line 1
> 时间: 0s
三、参考文章
?【SQL】自然连接、内连接、左连接、右连接 - 知乎 (zhihu.com)
SQL 连接(JOIN) | 菜鸟教程 (runoob.com)
SQL 联接的可视化表示 - 代码项目 (codeproject.com)
|