sql练习总结(一)

最近在学sql,遇到了这么一道题:

写出一条Sql语句:取出表A中第31到第40记录(SQLServer,以自动增长的ID作为主键,注意:ID可能不是连续的。 

把所能想到的实现方法都做了一遍:

1.用集合查询

 

select top 40 * from T_Test
except
select top 30 * from T_Test

 

2.用NOT IN 谓词

select top 10 * from T_Test where Id
not in(select top 30 Id from T_Test)

3.用ALL谓词

select top 10 * from T_Test where Id
>all(select top 30 Id from T_Test)

4.用MAX聚集函数

select top 10 * from T_Test where Id
>(select MAX(Id) from (select top 30 Id from T_Test) as A)

这里有些问题,因为 带有 top子句 的子查询 没有 order by 子句 排序的话,MAX(Id)作用的就是T_Test基本表,而不仅仅是A这个结果集,所以MAX(Id)会取到整个T_Test表的最大值,从而整个查询没有结果。

改正:

select top 10 * from T_Test where Id
>(select MAX(Id) from (select top 30 Id from T_Test order by Id) as A)

5.用开窗函数

select Id,Name from (select *, ROW_NUMBER() over(order by Id) as num from T_Test) as S
where S.num between 31 and 40

最后:水平有限,欢迎大家指教,共同学习进步!

 

 

转载于:https://www.cnblogs.com/chongxianjing/p/3727954.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值