数据库内连接、外连接 、交叉连接

数据库连接分为:内连接 外连接 交叉连接 (即笛卡尔积)  

内连接(INNER JOIN):分为三种:等值连接、自然连接、不等连接 

外连接(OUTER JOIN):分为三种:左外连接(LEFT JOIN)、右外连接(RIGHT JOIN)、全外连接(FULL JOIN)

 

交叉连接(CROSS JOIN):没有where 子句,它返回连接表中所有数据行的笛卡尔积

  1. 并集UNION:select  col1,col2  from  A UNION  select col1,col2 from  B ;
  2. 交集JOIN:select * from  A  JOIN  B on  A.name=B.name;
  3. 差集NOT:select * from  A  where  name  NOT  IN(select name from B);
  4. 笛卡尔积CROSS JOIN:select * from A CROSS JOIN B;  (等价于select * from A,B;)

SQL中的UNION与UNION ALL的区别:前者会去重,后者保留相同的;

交叉连接 CROSS JOIN: 如果不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积::笛卡尔积CROSS JOIN:select * from A CROSS JOIN B;  (等价于select * from A,B;) ; --------- 一般不建议使用该方法,因为如果有WHERE子句的话,往往会先生成两个表行数乘积的行的数据表然后才根据where条件中选择;;不适合大的表

 

内连接:INNER JOIN

如果仅仅使用 SELECT * FROM A INNER JOIN B 没有指定连接条件的话,和交叉连接的结果一样;

如果指定条件,如下:

--等值连接(不去重):selecr * from A INNER JOIN B on  A.col=B.col;

--不等连接:select * from A INNER JOIN B on  A.col>B.col;

--自然连接(去重)(公共属性只保留一):(通过相同名字的属性连接的结果就是自然连接)

 

外连接 OUTER JOIN:

 首先内连接和外连接的不同之处: 内连接如果没有指定连接条件的话,和笛卡尔积的交叉连接结果一样,但  

是不同于笛卡尔积的地方是,没有笛卡尔积那么复杂地要先生成行数乘积的数据表,内连接的效率要高于笛卡  

尔积的交叉连接。

·指定条件的内连接,仅仅返回符合连接条件的条目

·外连接则不同,返回的结果不仅包含符合连接条件的行,而且包括左表(左外连接时), 右表  (右连接时)或者两边连接(全外连接时)的所有数据行。

--左外连接LEFT JOIN:除了显示符合条件的数据行外,还显示左边数据表不符合条件的数据行;;要是右边没有对应的行,就显示NULL;(select A LEFT JOIN B on A.col=B.col;)

--右外连接RIGHT JOIN:除了显示符合条件的数据行外,还显示右边数据表不符合条件的数据行;;要是左边没有对应的行,就显示NULL;(select A RIGHT JOIN B on A.col=B.col;)

--外连接FULL OUTER JOIN:除了显示符合条件的数据行外,还显示左边和右边数据表不符合条件的数据行;;要是没有对应的行,就显示NULL;(select A  FULL OUT JOIN B on A.col=B.col;)

如果把舍弃的元组也保存在结果关系中,而在其他属性上空值,那么这种连接就叫外连接。如果只把左边关系R要舍弃的元组保留就叫左外连接,如果只把右边关系S中要舍弃的元组保留右外连接。

 

例子:

Id

a

b

1

2

3

2

5

4

表A

Id

c

d

2

2

3

3

9

4

表B

selecr * from A  natural  join B on A.Id=B.Id;自然连接的结果:

Id

a

b

c

d

2

5

4

2

3

selecr * from A left  join B on A.Id=B.Id;左连接的结果:

Id

a

b

c

d

1

2

3

Null

Null

2

4

4

2

3

selecr * from A  full out join B on A.Id=B.Id;全外连接的结果:

Id

a

b

c

d

1

2

3

Null

Null

2

5

4

2

3

3

Null

Null

9

4

selecr * from A  cross join B;交叉连接的结果:

IdA

IdB

a

b

c

d

1

2

2

3

2

3

1

3

2

3

9

4

2

2

5

4

2

3

2

3

5

4

9

4

 

 

 

你可能感兴趣的:(数据库,外连接,内连接,交叉连接)