对于SQL的Join,在学习起来多是比较乱的。咱们知道,SQL的Join语法有不少inner的,有outer的,有left的,有时候,对 于Select出来的结果集是什么样子有点不是很清楚。Coding Horror上有一篇文章,经过文氏图 Venn diagrams 解释了SQL的Join。我以为清楚易懂,转过来。 性能
假设咱们有两张表。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 |
1. [INNER] JOIN spa
SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name ci
结果集 |
(TableA.) |
(TableB.) |
id |
name |
id |
name |
1 |
Pirate |
2 |
Pirate |
3 |
Ninja |
4 |
Ninja |
Inner join 产生的结果集中,是A和B的交集。 table
2.FULL [OUTER] JOIN
(1)
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 |
Full outer join 产生A和B的并集。可是须要注意的是,对于没有匹配的记录,则会以null作为值。
可使用IFNULL判断。
(2)
SELECT * FROM TableA
FULL OUTER JOIN TableB ON TableA.name = TableB.name
WHERE TableA.id IS null OR TableB.id IS null
结果集 |
(TableA.) |
(TableB.) |
id |
name |
id |
name |
2 |
Monkey |
null |
null |
4 |
Spaghetti |
null |
null |
null |
null |
1 |
Rutabaga |
null |
null |
3 |
Darth Vade |
产生A表和B表没有交集的数据集。
3.LEFT [OUTER] JOIN
(1)
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 |
Left outer join 产生表A的彻底集,而B表中匹配的则有值,没有匹配的则以null值取代。
(2)
SELECT * FROM TableA
LEFT OUTER JOIN TableB ON TableA.name = TableB.name
WHERE TableB.id IS null
结果集 |
(TableA.) |
(TableB.) |
id |
name |
id |
name |
2 |
Monkey |
null |
null |
4 |
Spaghetti |
null |
null |
产生在A表中有而在B表中没有的集合。 基础
4.RIGHT [OUTER] JOIN
RIGHT OUTER
JOIN 是后面的表为基础,与LEFT OUTER JOIN用法相似。这里不介绍了。
5.UNION 与
UNION ALL
UNION 操做符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有类似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。UNION 只选取记录,而UNION ALL会列出全部记录。
(1)SELECT name FROM TableA
UNION SELECT name FROM TableB
新结果集 |
name |
Pirate |
Monkey |
Ninja |
Spaghetti |
Rutabaga |
Darth Vade |
选取不一样值
(2)SELECT name FROM TableA
UNION ALL SELECT name FROM TableB
新结果集 |
name |
Pirate |
Monkey |
Ninja |
Spaghetti |
Rutabaga |
Pirate |
Darth Vade |
Ninja |
所有列出来 select
(3)注意: 数据类型
SELECT * FROM TableA
UNION SELECT * FROM TableB
新结果集 |
id |
name |
1 |
Pirate |
2 |
Monkey |
3 |
Ninja |
4 |
Spaghetti |
1 |
Rutabaga |
2 |
Pirate |
3 |
Darth Vade |
4 |
Ninja |
因为 id 1 Pirate 与 id 2 Pirate 并不相同,不合并
还须要注册的是咱们还有一个是“交差集” cross join, 这种Join没有办法用文式图表示,由于其就是把表A和表B的数据进行一个N*M的组合,即笛卡尔积。表达式以下:SELECT * FROM TableA CROSS JOIN TableB
这个笛卡尔乘积会产生 4 x 4 = 16 条记录,通常来讲,咱们不多用到这个语法。可是咱们得当心,若是不是使用嵌套的select语句,通常系统都会产生笛卡尔乘积然再作过滤。这是对于性能来讲是很是危险的,尤为是表很大的时候。