目录
- 基本联接
- 交叉联接
- 内联接
- 外联接
- 自联接
- 多表联接
1.顺序联接
2.嵌套联接 - 联接算法
LOOP | MERGE | HASH - APPLY运算符
CROSS | OUTER APPLY
联接查询,关系数据库的主要特点,区别于其它数据库管理系统的主要标志。
将不同类型的数据存放在不同表中,可以防止产生冗余数据。
1.基本联接
1.1 语法
1.1.1 FROM子句联接
FROM table_1
join_type table_2 -- join_type 联接类型
on condition -- 联接条件
eg.
1.1.2 WHERE子句联接
1.2 补充
- 两个表中重复存在的列名,必须通过
表名.列名
的形式进行限定。另,这种限定还能提高可读性。 - 联接条件可以像指定其它库谓词一样指定其它比较运算符或关系运算符。而非仅仅适用于’=’。
- 联接条件用到的不同列,不必具有相同的名称或相同的数据类型。但如果数据类型不同,则必须兼容。如果数据类型不能隐式转换,则使用
CAST
函数显示转换。
2.交叉联接(CROSS JOIN)
联接查询的第1阶段,对两个表进行笛卡尔乘积,即生成表大小为1表的行 * 2表的行。
select * from test
go
select * from ee
go
select * from test, ee -- 等效
go
select * from test CROSS JOIN ee
注:
- 应用1
在SELECT中使用子查询时,由于对于所引用表中的每一行理论上都要执行一次子查询,比较耗资源。可使用CROSS JOIN来优化。(编写语句时使用查询计划辅助查看优化执行结果)
3.内联接(INNER JOIN)
仅获取两个表中与联接条件匹配的记录
select *
from t1
inner join t2
on t1.col1 = t2.col2 -- <>...等
4.外联接(LEFT | RIGHT | FULL [ OUTER ] JOIN
被保留全部行的表称为保留表。
在SQL的查询逻辑中,外联接最后阶段添加外部行添加的是保留表中与联接条件不匹配的所有行。
-- LEFT 保留T1全部行
-- RIGHT 保留T2全部行
-- FULL 保留T1和T2的全部行
select *
from T1
LEFT | RIGHT | FULL [ OUTER ] JOIN T2
ON T1.col1 = T2.col2
5.自联接
除与其它表进行联接,表还可以以任意方式与自身进行联接。
eg.1 INNER JOIN
eg.2 CROSS JOIN
6.多表联接
可以在FROM子句中包含多个联接。但每次只联接两个表,然后再将联接结果与下一个表进行联接,因此,联接顺序不同可能产生不同的结果集。
6.1 顺序联接
按照FROM子句中联接的书写顺序依次联接。
USE tt
GO
IF OBJECT_ID('Pro', 'U') IS NOT NULL
DROP TABLE Pro
IF OBJECT_ID('Sal', 'U') IS NOT NULL
DROP TABLE Sal
IF OBJECT_ID('Spo', 'U') IS NOT NULL
DROP TABLE Spo
IF OBJECT_ID('Stock', 'U') IS NOT NULL
DROP TABLE Stock
GO
CREATE TABLE Pro
(
Pro_id INT NOT NULL,
Pro_name CHAR(20) N