T-SQL 语言基础:高级子查询

目录

  1. 介绍
  2. 示例
  3. 总结
  4. 引用
  5. 数据库脚本下载
1. 介绍

高级子查询在 T-SQL 中提供了更复杂的查询能力,如返回前一个或后一个记录、连续聚合等。本文将介绍这些高级子查询的概念和应用。

2. 示例
  1. 返回前一个或后一个记录

示例:返回下一个小于当前订单号的最大值

SELECT 
	orderid, orderdate, empid, custid,
    (	SELECT MAX(O2.orderid) 
		FROM Sales.Orders O2 
		WHERE O2.orderid < O1.orderid
	) AS PrevOrderid
FROM Sales.Orders O1;

结果输出 830行:

返回下一个小于当前订单号的最大值

示例:返回下一个大于当前订单号的最小值

SELECT 
	orderid, orderdate, empid, custid,
    ( 	SELECT MIN(O2.orderid) 
      	FROM Sales.Orders O2 
      	WHERE O2.orderid > O1.orderid
    ) AS NextOrderid
FROM Sales.Orders O1;

结果输出 830行:

image_alt_text

**解释:** 以上查询分别返回当前记录的前一个和后一个订单 ID。
  1. 连续聚合
    连续聚合是一种累积数据(通常是按时间顺序)执行的聚合。

示例:返回每年的订单年份/订货量,以及连续几年的总订货量

SELECT 
	orderyear, qty,
    (	SELECT SUM(qty) 
    	FROM Sales.OrderTotalsByYear O2
    	WHERE O1.orderyear >= O2.orderyear
   	) AS RunQty
FROM Sales.OrderTotalsByYear AS O1;

image_alt_text

**解释:** 以上查询返回每年的订单年份和订货量,以及截至当前年份的总订货量。
  1. 行为不当的子查询
    示例:IN 谓词使用三值逻辑
SELECT custid, companyname 
FROM Sales.Customers C
WHERE custid NOT IN (
    SELECT O.custid FROM Sales.Orders O
);

**结果输出 **

image_alt_text

-- IN 谓词 使用三值谓语逻辑
-- NULL 问题
	-- 当子查询出现 NULL 值,但没有考虑三值逻辑时,会导致子查询出现问题
	-- ** 当orders 表中的custid 出现null值时,返回空集。因为 IN 谓语和 NULL 比较返回 UNknown
	-- Where 会过滤 Unknown

解决方案:排除 NULL 值

	SELECT custid, companyname FROM Sales.Customers C
	WHERE EXISTS (
		SELECT O.custid
		FROM Sales.Orders O
		where O.custid is not null
	);

结果输出 92行:

image_alt_text

解释: 当子查询出现 NULL 值时,需要显式排除这些值以避免查询问题。

3. 总结

高级子查询提供了更复杂和强大的查询能力,如返回前一个或后一个记录、连续聚合等。通过理解和应用这些高级子查询,我们可以编写更灵活和高效的 SQL 查询。

4. 引用
  • Microsoft SQL Server 文档:https://docs.microsoft.com/en-us/sql/sql-server/
数据库脚本下载

TSQLFundamentals2008


**喜欢的话,请收藏 | 关注(✪ω✪)**
……**万一有趣的事还在后头呢,Fight!!(o^-^)~''☆ミ☆ミ**……
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值