[No00008C]图解SQL的各种连接join让你对SQL的连接一目了然

 

对于SQL的Join,在学习起来可能是比较乱的。我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚。Coding Horror上有一篇文章(实在不清楚为什么Coding Horror也被墙)通过文氏图Venndiagrams解释了SQL的Join。我觉得清楚易懂,转过来。

假设我们有两张表,TableA是左边的表,TableB是右边的表。

其各有四条记录,其中有两条记录是相同的,如下所示:

1

id 

name 

id 

name 

2

-- 

---- 

-- 

---- 

3

1

Pirate 

1

Rutabaga 

4

2

Monkey 

2

Pirate 

5

3

Ninja 

3

Darth Vader

6

4

Spaghetti 

4

Ninja 

下面让我们来看看不同的Join会产生什么样的结果。

Inner join产生的结果集中,是A和B的交集。

1

SELECT * FROM TableA INNER JOIN TableB

2

ON TableA.name = TableB.name

3

id 

name 

id 

name 

4

-- 

---- 

-- 

---- 

5

1

Pirate 

2

Pirate 

6

3

Ninja 

4

Ninja 

Full outer join产生A和B的并集。但是需要注意的是,对于没有匹配的记录,则会以null做为值。

01

SELECT * FROM TableA FULL OUTER JOIN TableB

02

ON TableA.name = TableB.name

03

id 

name 

id 

name 

04

-- 

---- 

-- 

---- 

05

1

Pirate 

2

Pirate

06

2

Monkey 

null

null

07

3

Ninja

4

Ninja

08

4

Spaghetti

null

null

09

null 

null

1

Rutabaga

10

null 

null

3

Darth Vader

Left outer join产生表A的完全集,而B表中匹配的则有值,没有匹配的则以null值取代。

01

SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name

02

ON TableA.name = TableB.name

03

id 

name 

id 

name 

04

-- 

---- 

-- 

---- 

05

1

Pirate 

2

Pirate 

06

2

Monkey 

null 

null 

07

3

Ninja 

4

Ninja 

08 

4

Spaghetti 

null

null 

09 

null 

null 

1

Rutabaga 

10

null 

null 

3

Darth Vader

 

01

SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name

02

id 

name 

id 

name 

03

-- 

---- 

-- 

---- 

04

1

Pirate 

2

Pirate 

05

2

Monkey 

null 

null 

06

3

Ninja 

4

Ninja 

07

4

Spaghetti

null 

null 

01

SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableB.id IS null

02

id 

name 

id 

name 

03

-- 

---- 

-- 

---- 

04

2

Monkey 

null 

null 

05

4

Spaghetti 

null 

null 

产生在A表中有而在B表中没有的集合。

01

SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableA.id IS null OR TableB.id IS null

02

id 

name 

id 

name 

03

-- 

---- 

-- 

---- 

04

2

Monkey 

null 

null 

05

4

Spaghetti 

null 

null 

06

null 

null 

1

Rutabaga 

07

null 

null 

3

Darth Vader 

产生A表和B表都没有出现的数据集。

还需要注册的是我们还有一个是"交差集"crossjoin,这种Join没有办法用文式图表示,因为其就是把表A和表B的数据进行一个N*M的组合,即笛卡尔积。表达式如下:

01

SELECT * FROM TableA 

02

CROSS JOIN TableB 

这个笛卡尔乘积会产生4x4=16条记录,一般来说,我们很少用到这个语法。但是我们得小心,如果不是使用嵌套的select语句,一般系统都会产生笛卡尔乘积然再做过滤。这是对于性能来说是非常危险的,尤其是表很大的时候。

 

原文地址:https://www.cnblogs.com/Chary/p/No00008C.html