MSSQL_7- 联接和APPLY运算符

本文详细介绍了SQL中的联接操作,包括基本联接、交叉联接、内联接、外联接、自联接和多表联接,强调了联接顺序和算法的影响。此外,还讲解了APPLY运算符,分为CROSS APPLY和OUTER APPLY,以及它们在查询优化中的作用。
摘要由CSDN通过智能技术生成

目录

  • 基本联接
  • 交叉联接
  • 内联接
  • 外联接
  • 自联接
  • 多表联接
    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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值