前言
前一段时间工作一直是和SQL打交道, 遇到一个sql连接查询问题, 自己疫情在家躺尸,早就把这方面的知识还给学校了,这里就把查到的一些资料以及把自己遇到的问题和解决方法记录一下。
Join
我们知道,SQL
的Join
语法有很多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的交集。
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
做为值。
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值取代。
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、以及一些内容都出自这里