第四章 子查询(1)

--4.1 独立子查询
use TSQLFundamentals2008
go

declare @maxid as int = (select MAX(orderid) from Sales.Orders)

select orderid, orderdate, empid, custid
from Sales.Orders
where orderid = @maxid

--4.1.1 独立标量子查询
select orderid, orderdate, empid, custid
from Sales.Orders
where orderid = (select MAX(orderid) from Sales.Orders)

--4.1.2 独立多值子查询
select orderid 
from Sales.Orders
where empid in
(select e.empid 
from HR.Employees e 
where e.lastname like 'D%')

select custid, orderid, orderdate, empid
from Sales.Orders
where custid in 
(select c.custid 
from Sales.Customers as c
where c.country = N'USA');

--没有下过任何订单的客户
select custid, companyname
from Sales.Customers
where custid not in 
(select o.custid from Sales.Orders o)

use tempdb;
select *
into dbo.orders
from TSQLFundamentals2008.Sales.Orders
where orderid % 2=0

select n 
from dbo.Nums
where n between(select MAX(o.orderid) from dbo.orders o)
and (select MIN(o.orderid) from dbo.orders o)
and n not in(select o.orderid from dbo.orders o)

--4.2 相关子查询
--为每个客户返回其订单ID最大的订单
use TSQLFundamentals2008
select custid, orderid, orderdate, empid
from Sales.Orders as o1
where orderid =
(select MAX(o2.orderid) from Sales.Orders as o2
where o1.custid = o2.custid)

select custid, MAX(orderid) as maxorderid
from Sales.Orders
group by custid


--4.2.1 exists谓词
--与T-SQL中的大多数谓词不同, exists谓词使用的是二值逻辑,而不是三值逻辑
--返回下过订单的西班牙客户
select custid, companyname
from Sales.Customers as c
where country = N'Spain'
and exists
(select * from Sales.Orders as o
where c.custid = o.custid)

--返回没下过订单的西班牙客户
select custid, companyname
from Sales.Customers as c
where country = N'Spain'
and not exists
(select * from Sales.Orders as o
where c.custid = o.custid)

--4.3 高级子查询
--4.3.1返回前一个或后一个记录
--返回当前订单的信息和它的前一个订单的ID
select orderid, orderdate, empid, custid,
(select MAX(O2.orderid) from Sales.Orders o2
where o2.orderid < o1.orderid) as prevorderid
from Sales.Orders as o1

--返回当前订单的信息和它的下一个订单的ID
select orderid, orderdate, empid, custid,
(select MIN(o2.orderid) from Sales.Orders o2
where o2.orderid>o1.orderid) as nextorderid
from Sales.Orders as o1

--4.3.2 连续聚合
--返回每年的订单年份\订货量,以及连续几年的总订货量
select orderyear, qty, (select SUM(qty)
from Sales.OrderTotalsByYear o1
where o1.orderyear<=o2.orderyear) as totalqty
from Sales.OrderTotalsByYear o2
order by orderyear asc

--与IN不同的是,exists使用的是二值谓词逻辑,所以exists总是返回true或false,而绝不会返回unknown.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值