1 一般数据查询
1.1 top
格式
select top 3 Sname from Students
1.2 CASE
select Sname,Slevel =
CASE
WHEN Sgrade>90 THEN '优秀'
WHEN Sgrade<90 THEN '一般'
END
from Students
1.3 INTO
select CustomerID,CName INTO #CardIDTable from Table_Customer
将查询结果保存到新的表中,局部临时表通过在表名前面加#来标识
2 查询结构的并、交、差运算
2.1 UNION
并运算
select 语句1
UNION
select 语句2
2.2 INTERSECT
交运算:返回两个查询集合中各列的值均相同的记录,并用这些记录构成交运算的结果
select 语句1
INTERSECT
select 语句2
2.3 EXCEPT
差运算:将返回第一个集合中有但第二个集合中没有的数据
select 语句1
EXCEPT
select 语句2
3 相关子查询
(1)也称为内层查询
- 对于包含相关子查询,先执行外层查询,再执行内层查询
- 对于包含基于集合测试子查询,先执行内层查询,再执行外层查询
(2)分类
- 进行基于集合的子查询
where 表达式 IN 子查询
这种子查询的语句是分步骤的,先执行子查询,然后在子查询的结果基础再执行外层查询
- 进行比较的子查询
where 表达式 比较运算符 (子查询)
要求子查询语句必须是返回单值的查询语句
子查询的查询条件不依赖于外层查询,称这样的子查询为不相关子查询或嵌套查询
- 进行存在性判断的子查询
where EXISTS (子查询)
6 其他形式的子查询
6.1 替代子查询
在Select语句的选择列表中嵌入一个只返回一个标量值的select 语句,子查询语句通常都是通过一个聚合函数来返回一个单值
Select Cname,Address (select count(*) from Table_sale a
JOIN Table_Customer b ON a.cardID = b.cardID where CustomerID = 'G001') AS TotalTImes
6.2 派生表
是将子查询作为一个表来处理,这个由子查询产生的新表就被称为派生表,类似于临时表
Select * from (Select * from T1) AS temp 这里的temp就是派生表
7 其他一些查询功能
7.1 开窗函数
(1)简介
一组行被称为一个窗口,开窗函数是指可以用于“分区”或“分组”计算的函数,SUM、AVG、ROW_NUMBER等都可被称为开窗函数,开窗户函数可以分别应用于每个分区,把每个分区看成是一个窗口,并为每个分区进行计算,开窗函数必须放在OVER子句前边
(2)分类
- 将OVER子句与聚合开窗函数一起使用
OVER子句用于确定在应用关联的开窗函数之前对行集的分区和排序
Select Cno,CName,Semester Credit
SUM(Credit) OVER(PARTITION BY Semester) AS 'Total' From Course
- 将OVER子句与排名开窗函数一起使用
排名函数为分区中的每一行返回一个排名值
SQL Server提供了四个排名函数:Rank、DENSE_RANK、NTILE和ROW_NUMBER
RANK()
返回结果集中每行数据在每个分区的排名
Select OrderID ,ProductID,OrderQty,
RANK() OVER
(PARTITION BY OrderID ORDER BY OrderQty DESC) AS RANK
from OrderDetail
ORDER BY OrderID
DENSE_RANK()
与RANK()一样,唯一区别是DENSE_RANK()函数的排名中间没有间断,即该函数返回的是一个连续的整数值
Select OrderID ,ProductID,OrderQty,
DENSE_RANK() OVER
(PARTITION BY OrderID ORDER BY OrderQty DESC) AS DENSE_RANK
from OrderDetail
ORDER BY OrderID
NTILE()
将有序分区中的行划分到指定数目的组中,每个组有一个编号,编号从1开始。对于每一行,NTILE()将返回此行所属的组的编号
Select OrderID ,ProductID,OrderQty,
NTILE(4) OVER
(ORDER BY OrderQty DESC) AS FourGroups
from OrderDetail
将全部数据划分为4组,因此不需要进行分区,在OVER子句中只需对订购数量进行降序排序即可
ROW_NUMBER()
返回结果集中每个分区内行的序列号,每个分区的第一行从1开始
查询电冰箱类商品、销售单价以及该商品在该类上商品中的价格排名
SELECT GoodsName,SaleUnitPrice ROW_NUMBER() OVER (ORDER BY SaleUnitPrice DESC )AS 'Number' FROM Table_GoodsClass C JOIN Table_Goods G
ON C.GoodsClassID = G.GoodsClassID
where GoodsClassName = '电冰箱'
7.2 公用表表达式
将查询语句产生的结果集指定一个临时命名的名字,这些命名的结果集就被称为公用表表达式
定义一个统计每个会员的购买商品总次数的CTE,并利用CTE查询会员卡号和购买商品总次数
WITH BuyCount(CardID,Counts) AS (SELECT CardID ,Count(*)
From Table_saleBill GROUP BY CardID)
SELECT CardID,Counts FROM BuyCount ORDER BY Counts