SQL

SQL的连接查询

inner join、left join、right join、full outer join、union、union all的区别

Posted by RainbomSea on September 27, 2020

前言

前一段时间工作一直是和SQL打交道, 遇到一个sql连接查询问题, 自己疫情在家躺尸,早就把这方面的知识还给学校了,这里就把查到的一些资料以及把自己遇到的问题和解决方法记录一下。

Join

我们知道,SQLJoin语法有很多inner的,有outer的,有left的,有时候,对于select出来的结果集是什么样子有点不是很清楚。通过韦恩图(Venn diagram, 可用来表示多个集合之间的逻辑关系),可以帮我们有效的理解这些。

假设我们有两张表。Table A 是左边的表。Table B 是右边的表。其各有四条记录,其中有两条记录name是相同的,如下所示:让我们看看不同JOIN的不同

A表  
id name
1 Pirate
2 Monkey
3 Ninja
4 Spaghetti
B表  
id name
1 Rutabaga
2 Pirate
3 Darth Vade
4 Ninja

INNER JOIN

INNER JOIN 产生的结果集中,是表A和表B的交集。

0kRkbq.png

SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name
结果集      
(TableA.)   (TableB.)  
id name id name
1 Pirate 2 Pirate
3 Ninja 4 Ninja

FULL [OUTER] JOIN

FULL OUTER JOIN 产生表A和表B的并集。对于没有匹配的记录,则会以Null做为值。

0kRod0.png

SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name
结果集      
(TableA.)   (TableB.)  
id name id name
1 Pirate 2 Pirate
2 Monkey null null
3 Ninja 4 Ninja
4 Spaghetti Null Null
Null Null 1 Rutabaga
Null Null 3 Darth Vade

LEFT [OUTER] JOIN

LEFT OUTER JOIN 产生表A的完全集,B表中没有匹配的则以null值取代。

0kbWqS.png

SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name
结果集      
(TableA.)   (TableB.)  
id name id name
1 Pirate 2 Pirate
2 Monkey null null
3 Ninja 4 Ninja
4 Spaghetti Null Null

RIGHT [OUTER] JOIN

RIGHT OUTER JOIN 是后面的表为基础,与LEFT OUTER JOIN用法类似。产生表B的完全集,A表中没有匹配的则以null值取代。

UNION 与 UNION ALL

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。每条 SELECT 语句中的列的顺序必须相同。

UNION ALL是直接连接,取到得是所有值,记录可能有重复 UNION 是取唯一值,记录没有重复

UNION将会按照字段的顺序进行排序; UNION ALL只是简单的将两个结果合并后就返回。

SELECT name FROM TableA UNION SELECT name FROM TableB
结果集
name
Pirate
Monkey
Ninja
Spaghetti
Rutabaga
Darth Vade
SELECT name FROM TableA UNION ALL SELECT name FROM TableB
结果集
name
Pirate
Monkey
Ninja
Spaghetti
Rutabaga
Pirate
Darth Vade
Ninja

使用Join遇到的问题及解决方法

参考博文

Mysql: 图解 inner join、left join、right join、full outer join、union、union all的区别 本文使用到的图片、Sql、以及一些内容都出自这里