多表连接查询是使用Sql的基本操作,但连接的方式却有多种,熟练使用这些连接方式能够简化Sql语句,提高数据库运行效率。
在学习连接查询之前,先建立2个表作为例子:
TAB1:
COL1 | COL2 |
1 | TAB1_1 |
2 | TAB1_2 |
3 | TAB1_3 |
TAB2:
COL1 | COL3 |
1 | TAB2_1 |
2 | TAB2_2 |
4 | TAB2_4 |
5 | TAB2_5 |
连接可以在select 语句的from子句和where子句中建立,也可以利用join关键字在from子句中建立,在from子句中指出连接时有助于将连接操作与where子句中的查询条件区分开来。所以,在Transact-SQL中推荐使用这种方法。
SQL-92标准所定义的FROM子句的连接语法格式为:
FROM join_table join_type join_table
[ON (join_condition)]
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一个表操作的连接又称做自连接。
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑运算符等构成。
join_type指出连接类型,可以有以下类型:
1、join或inner join(内连接)
内连接使用比较运算符比较被连接列的列值,列出与连接条件匹配的数据行。
Sql语句如:
select t1.col1 t1_col1,col2,t2.col1 t2_col1,col3 from tab1 t1 inner join tab2 t2 on t1.col1=t2.col1 (其中“inner”可省略)。
也可以写为:
select t1.col1 t1_col1,col2,t2.col1 t2_col1,col3 from tab1 t1, tab2 t2 where t1.col1=t2.col1
结果为:
T1_COL1 | COL2 | T2_COL1 | COL3 |
1 | TAB1_1 | 1 | TAB2_1 |
2 | TAB1_2 | 2 | TAB2_2 |
2、left join或left outer join(左外连接)
返回符合连接条件的行,而且还包括左表中的所有数据行,左表中不符合连接条件的行的其余字段为空。
Sql语句如:
select t1.col1 t1_col1,col2,t2.col1 t2_col1,col3 from tab1 t1 left outer join tab2 t2 on t1.col1=t2.col1 (其中“outer”可省略)。
也可以写为:
select t1.col1 t1_col1,col2,t2.col1 t2_col1,col3 from tab1 t1, tab2 t2 where t1.col1=t2.col1(+)
结果为:
T1_COL1 | COL2 | T2_COL1 | COL3 |
1 | TAB1_1 | 1 | TAB2_1 |
2 | TAB1_2 | 2 | TAB2_2 |
3 | TAB1_3 |
|
|
3、right join或right outer join(右外连接)
返回符合连接条件的行,而且还包括右表中的所有数据行,右表中不符合连接条件的行的其余字段为空。
Sql语句如:
select t1.col1 t1_col1,col2,t2.col1 t2_col1,col3 from tab1 t1 right outer join tab2 t2 on t1.col1=t2.col1 (其中“outer”可省略)。
也可以写为:
select t1.col1 t1_col1,col2,t2.col1 t2_col1,col3 from tab1 t1, tab2 t2 where t1.col1(+)=t2.col1
结果为:
T1_COL1 | COL2 | T2_COL1 | COL3 |
1 | TAB1_1 | 1 | TAB2_1 |
2 | TAB1_2 | 2 | TAB2_2 |
|
| 4 | TAB2_4 |
|
| 5 | TAB2_5 |
4、full join或full outer join(全外连接)
返回符合连接条件的行,而且还包括左、右两个表中的所有数据行,两个表中不符合连接条件的行的其余字段为空。
Sql语句如:
select t1.col1 t1_col1,col2,t2.col1 t2_col1,col3 from tab1 t1 full outer join tab2 t2 on t1.col1=t2.col1 (其中“outer”可省略)。
结果为:
T1_COL1 | COL2 | T2_COL1 | COL3 |
1 | TAB1_1 | 1 | TAB2_1 |
2 | TAB1_2 | 2 | TAB2_2 |
3 | TAB1_3 |
|
|
|
| 4 | TAB2_4 |
|
| 5 | TAB2_5 |
5、natural join(自然连接)
要求有同名同数据类型的列名,隐含了这样列的相等连接,并删除连接表中的重复列。联接中使用的列不能有限定词。
Sql语句如:
select * from tab1 natural join tab2
结果为:
COL1 | COL2 | COL3 |
1 | TAB1_1 | TAB2_1 |
2 | TAB1_2 | TAB2_2 |
可以与select * from tab1 t1 inner join tab2 t2 on t1.col1=t2.col1对照其中的区别。
6、cross join(笛卡尔积)
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
Sql语句如:
select t1.col1 t1_col1,col2,t2.col1 t2_col1,col3 from tab1 t1 cross join tab2 t2
也可以写为:
select t1.col1 t1_col1,col2,t2.col1 t2_col1,col3 from tab1 t1, tab2 t2 where t1.col1(+)=t2.col1
结果为:
T1_COL1 | COL2 | T2_COL1 | COL3 |
1 | TAB1_1 | 1 | TAB2_1 |
1 | TAB1_1 | 2 | TAB2_2 |
1 | TAB1_1 | 4 | TAB2_4 |
1 | TAB1_1 | 5 | TAB2_5 |
2 | TAB1_2 | 1 | TAB2_1 |
2 | TAB1_2 | 2 | TAB2_2 |
2 | TAB1_2 | 4 | TAB2_4 |
2 | TAB1_2 | 5 | TAB2_5 |
3 | TAB1_3 | 1 | TAB2_1 |
3 | TAB1_3 | 2 | TAB2_2 |
3 | TAB1_3 | 4 | TAB2_4 |
3 | TAB1_3 | 5 | TAB2_5 |