图解 SQL 各种连接查询之间的区别上海时时乐走势

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

null

上海时时乐走势图官网 1上海时时乐走势图官网 2

Monkey

 

Spaghetti

(3) 注意:

id

       SELECT * FROM TableA CROSS JOIN TableB         这个笛卡尔乘积会产生 4 x 4 = 16 条记录,

新结果集
name
Pirate
Monkey
Ninja
Spaghetti
Rutabaga
Pirate
Darth Vade
Ninja

2. FULL [OUTER] JOIN 

Darth Vade

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

id

 

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

1.  INNER JOIN

选取不同值

上海时时乐走势图官网 3

1

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
注意,a。 UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。

上海时时乐走势图官网 4

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

(原文地址:)

 

新结果集

结果集为交集。

Pirate

4. RIGHT [OUTER] JOIN

Ninja

(2) 同时使用ISNULL 的判断,可以取得A和B两者没有交集的数据集。

2

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

Ninja

 

2

(1) SELECT name FROM TableA UNION SELECT name FROM TableB

null

上海时时乐走势图官网 5

(TableA.)

GROUP   可以重新挑选组合集合。

4

上海时时乐走势图官网 6

null

上海时时乐走势图官网 7   union                  上海时时乐走势图官网 8

id

FROM      是从 哪些 ‘数据源’中获取数据,而这些数据源是可以通过各种JOIN进行挑选的。

(TableA.)

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

Pirate

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

上海时时乐走势图官网 9

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

Darth Vade

SELECT * FROM TableA UNION SELECT * FROM TableB

null

上海时时乐走势图官网 10

id

(1)

2

RIGHT OUTER JOIN 是后面的表为基础,与LEFT OUTER JOIN用法类似。这里不介绍了。

Ninja

上海时时乐走势图官网 11

id

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

4

  转载自:

结果集

 

可以使用IFNULL判断。

    b。每条 SELECT 语句中的列的顺序必须相同。

上海时时乐走势图官网 12

SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name

3

  union  all

null

 

(1)SELECT name FROM TableA UNION SELECT name FROM TableB

(2) LEFT JOIN 结合where IS NULL ,可以取得只有在A中的数据集。

1

ORDER BY进行结果的排序等。

2

由于 id 1 Pirate   与 id 2 Pirate 并不相同,不合并

上海时时乐走势图官网 13

3. LEFT [OUTER] JOIN

Pirate

 

null

5. UNION 与 UNION ALL

Spaghetti

 

null

LIMIT   进而限制挑选,

3

可以使用IFNULL判断。

Rutabaga

上海时时乐走势图官网 14

2

SELECT    选择的是从‘结果集1’中取得某几列。

id

从这里我们看出 

4

        c。UNION 只选取记录,每一行的数据都是不一样的。而UNION ALL会列出所有记录,重复的也会列出来

(2)SELECT name FROM TableA UNION ALL SELECT name FROM TableB

 

4

 

Spaghetti

总结:这个很好用,可以用来对生产或者测试上的数据进行补数据的操作。

3

注意:这个可能很常用,但是注意B中匹配到了才有值,没有匹配到会变成NULL。

id

说到底,SQL是对集合的获取。

1

注意:这个在获取到数据进行展示的时候,要注意NULL的判断。

(TableA.)

WHERE   再加上where 从 select出的‘结果集2’ 中限制某些数据

4.RIGHT [OUTER] JOIN

 

name

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

Pirate

(TableB.)

2

1

Ninja

Pirate

id

null

null

null

null

Ninja

name

null

name

Ninja

(3)注意:

id

(2)

1

id

4

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

Pirate

4

null

Rutabaga

null

1

null

SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name

name

Ninja

3

id

2

null

null

3

2

Pirate

 产生A表和B表没有交集的数据集。

2

3.LEFT [OUTER] JOIN

Ninja

Rutabaga

id

(2)

Darth Vade

2.FULL [OUTER] JOIN 

新结果集
name
Pirate
Monkey
Ninja
Spaghetti
Rutabaga
Darth Vade

Monkey

4

Ninja

2

(TableB.)

name

4

(TableB.)

Darth Vade

1

5.UNION  UNION ALL

null

name

name

结果集

上海时时乐走势图官网 15

Rutabaga

3

4

name

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

Pirate

1

id

Monkey

B表

Monkey

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

(TableA.)

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

null

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

3

Spaghetti

null

Spaghetti

1

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。UNION 只选取记录,而UNION ALL会列出所有记录。

null

null

3

(TableB.)

null

name

4

(TableA.)

结果集

由于 id 1 Pirate   与 id 2 Pirate 并不相同,不合并

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

全部列出来

RIGHT OUTER JOIN 是后面的表为基础,与LEFT OUTER JOIN用法类似。这里不介绍了。

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

name

Pirate

Pirate

Spaghetti

A表

4

1.INNER JOIN

Monkey

(TableB.)

name

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

(1)

结果集

SELECT * FROM TableA UNION SELECT * FROM TableB

name

Ninja

name

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

Monkey

3

结果集

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

2

(1)

null

本文由上海时时乐走势图发布于上海时时乐走势图官网,转载请注明出处:图解 SQL 各种连接查询之间的区别上海时时乐走势

您可能还会对下面的文章感兴趣: