连接

  · 内连接

  · 外连接

    · 左连接

    · 右连接

    · 全连接

    · 交叉连接

  · 匹配符号(+)

 

 连接 

根据表之间的关系,呈现跨表查询的结果。

 

 

 

外连接

 

 

内连接

左连接

右连接

全连接

交叉连接

基准

 

左表

右表

 

 

显示数据

两表公共部分

左表全部

右表满足条件部分

无显示NULL

右表全部

左表满足条件部分

无显示NULL

左右表全部

无显示NULL

两表所有行的组合

(笛卡尔积)

关键词

(inner) join

(left) join

(right) join

full (outer) join

cross join

语法简述

A join B on 条件

A left join B on 条件

A right join B on 条件

A full join B on 条件

A cross join B on 条件

 

 

 

 

 

 

 

 

 

 

就表A、表B示例

Aid

name

age

1

Mary

22

2

Jack

20

 

 

 

Aid

name

1

Jack

2

Ma

 

 

 

 

内连接

- 等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。

- 不等值连接:在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。

- 自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。

 

获取两表的公共部分

select * from A (inner) join B on A.name = B.name (显性内连接)

select * from A where A.name = B.name (隐性外连接)

 

A_Aid

A_name

A_age

B_Bid

B_name1

1

Jack

22

1

Jack

 

 

 

外连接

左连接

以左表为基准,左表数据全部返回,右表数据只满足where条件,无显示NULL

select * from A left (outer) join B on A.name = B.name 均为全表扫描

select * from A where A.name = B.name (+) A为全表扫描,B为索引扫描,效率稍高

A_Aid

A_name

A_age

B_Bid

B_name1

1

Jack

22

1

Jack

2

Mary

20

NULL

NULL

 

 

 

 

右连接

以右表为基准,右表数据全部返回,左表只返回满足条件的,无显示NULL

select * from A right (outer) join B on A.name = B.name

select * from A where A.name(+) = B.name

A_Aid

A_name

A_age

B_Bid

B_name1

1

Jack

22

1

Jack

NULL

NULL

NULL

2

Ma

 

 

 

 

全连接

显示两表全部数据,完整外部联接返回左表和右表中的所有行。

当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。

如果表之间有匹配行,则整个结果集行包含基表的数据值。

select * from A full (outer) join B on A.name = B.name

A_Aid

A_name

A_age

B_Bid

B_name1

1

Jack

22

1

Jack

2

Mary

20

NULL

NULL

NULL

NULL

NULL

2

Ma

 

 

 

 

 

交叉连接

将两个表的所有行进行组合,连接后的行数为两个表的乘积数。(笛卡尔积)

select * from A cross join B

A_Aid

A_name

A_age

B_Bid

B_name1

1

Jack

22

1

    Jack  

1

Jack

22

2

Ma

2

Mary

20

1

Jack

2

Mary

20

2

Ma

 

 

 

 

 

匹配符号

对于外连接, 也可以使用“(+) ”来表示。 关于使用(+)的一些注意事项:

1.(+)操作符只能出现在where子句中,并且不能与outer join语法同时使用。

2.  当使用(+)操作符执行外连接时,如果在where子句中包含有多个条件,则必须在所有条件中都包含(+)操作符

3.(+)操作符只适用于列,而不能用在表达式上。

4.(+)操作符不能与or和in操作符一起使用。

5.(+)操作符只能用于实现左外连接和右外连接,而不能用于实现完全外连接。

一句话记忆:+号在哪里,就是匹配表