在SQLServer2005中引入了一些新的元素,包括:
- 表运算符 apply、pivot、unpivot
- 新的over子句
- 新的集合操作except、intersect
Apply 包括cross apply 和 outer apply两种,区别同inner join 和outer join一样。实际上这个新的apply操作和join操作是同一个效果的,只是有下面两个不同:
- 在进行join操作时,如果真实表a join 表值函数b的话,如果b的参数想引用参数a,这种情况是报错的。apply诞生是为了解决该问题。
- join是第一步是进行俩表交叉链接,apply是针对左边表的每一行去应用右表表达式,然后得到结果
Pivot、unpivot 这两个东西是去年接触一个项目的时候才遇到的,当时奇怪这个东西究竟是做什么的?现在又回味这个东西,想来想去,觉得应该是针对一个特定问题的处理方式,这个问题如下描述:
在描述一类对象的一些属性时我们往往可以有两种方式设计表结构,一种是【对象、属性1、属性2...】这种方式,一种是【对象、属性、值】这种方式,显然两种方式都有着比较明显的优缺点:
前者:
缺点:扩展属性需要修改表结构 优点:一条记录可以取到所有属性
后者:
缺点:取一个对象的属性信息需要返回多条记录 优点:扩展属性值灵活方便,可以根据属性统计对象信息
所以在这两种方式上传统的也有一些办法进行行列的转换,正因为如此在2005中加入了pivot、unpivot这两个操作符方便我们处理。
举例说明:pivot 转换表
CREATE TABLE dbo.abc ( a VARCHAR (20) NULL , b VARCHAR (20) NULL , v INT NULL ) GO |
插入示例数据
INSERT INTO abc VALUES ( '李四' , '英语' , 40); INSERT INTO abc VALUES ( '李四' , '数学' , 80); INSERT INTO abc VALUES ( '李四' , '语文' , 50); INSERT INTO abc VALUES ( '张三' , '语文' , 90); INSERT INTO abc VALUES ( '张三' , '数学' , 60); |
得到转置后的结果集
SELECT * FROM abc pivot( sum (v) FOR b IN (数学,语文,英语)) AS p |
结果集如下
名字 数学 语文 英语<br>李四 80 50 40 张三 60 90 null |
Over子句在排名函数和聚合函数中的应用
注意:
- 排名函数只能用于select选择列表中和order by子句中,即选择序号列、根据序号列进行排序
- PARTITION BY 对行数据进行分区 Order by对行数据进行排序, 这两个操作可以用在over子句中
over子句的作用一个是对数据进行分组,但是这个分组和group by是不同的,PARTITION BY针对每行数据都返回一条记录,我们可以进行统计,如:求和、平均值等,然后再跟改行的原有数据进行一些操作、对比等。
over自己的另一个作用是根据分区产生序号,row_number() over(order by filed_list) 默认为根据整条记录产生序号,可以用分区操作为每个分区分别创建自己的序号
except、intersect 这两个操作从名字就可以看出,一个是求差、一个是求交集,同逻辑操作
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库