sql 查询不包含_这些SQL查询小技巧,一般人我不告诉他

行列转换

问题:假设有张学生成绩表(tb)如下:

6da9d02a59fe332e466e0ef650fb6e19.png

想变成(得到如下结果):

848bbf65c19181ac82f2a0daf87fa439.png

代码:

WITH tb(姓名,课程,分数) AS(SELECT N'张三',N'语文',74UNION ALLSELECT N'张三',N'数学',83UNION ALLSELECT N'张三',N'物理',93UNION ALLSELECT N'李四',N'语文',79UNION ALLSELECT N'李四',N'数学',86UNION ALLSELECT N'李四',N'物理',88)​SELECT 姓名 ,MAX(CASE 课程 WHEN '语文' THEN 分数 ELSE 0 END) 语文,MAX(CASE 课程 WHEN '数学' THEN 分数 ELSE 0 END) 数学,MAX(CASE 课程 WHEN '物理' THEN 分数 ELSE 0 END) 物理FROM tb GROUP BY 姓名

分页

方案一:利用NOT IN和SELECT TOP分页语句形式

SELECT TOP 10 * FROM TestTableWHERE ID NOT IN(SELECT TOP 20 ID FROM TestTable ORDER BY ID)ORDER BY ID 

方案二:利用ID大于多少和SELECT TOP分页语句形式

SELECT TOP 10 * FROM TestTable WHERE ID > (SELECT MAX(id) FROM (SELECT TOP 20 id FROM TestTable ORDER BY id) AS T)ORDER BY ID 

方案三:利用SQL Server中的特性ROW_NUMBER进行分页

SELECT * FROM ( SELECT ROW_NUMBER() OVER(ORDER BY ID DESC) AS ROWID,*  FROM TestTable) AS mytable where ROWID between 21 and 40

结果合并

合并重复行

 SELECT * FROM A UNION SELECT * FROM B

不合并重复行

 SELECT * FROM A UNION ALL SELECT * FROM B

随机排序

SELECT * FROM TestTable ORDER BY NEWID()

还可以结合TOP取随机的前N条记录

SELECT TOP 100 * FROM TestTable ORDER BY NEWID()

以任意符号分隔取两边数据

例如我们以逗号(,)来分割数据,将如下数据

09dbd1cd675155caf2bb4af2b900125a.png

分割成如下图所示:

4d0573cc67a1c2e5e213215088fbcddb.png
SELECT R,CASE WHEN CHARINDEX(',',R)>1 THEN LEFT(R,CHARINDEX(',',R)-1) ELSE NULL END AS R1 ,CASE WHEN CHARINDEX(',',R)>1 THEN RIGHT(R,(LEN(R) - CHARINDEX(',',R))) ELSE NULL END AS R2FROM t

代码较长,我们对代码进行拆分来理解:

 SELECT CHARINDEX(',',',') --结果是1 SELECT CHARINDEX(',','NULL') --结果是0 SELECT CHARINDEX(',','') --结果是0 SELECT CHARINDEX(',','A,B') --结果是2 SELECT LEN('A,B') --结果是3 SELECT LEN('A,B') - CHARINDEX(',','A,B') --结果是3-2=1 SELECT RIGHT('A,B',( LEN('A,B') - CHARINDEX(',','A,B'))) --结果是 B

最后一步我们将'A,B'拆分出来了B,同理A我们也可以用类似的方法获取到。

WAITFOR延时执行

例 等待1 小时2 分零3 秒后才执行SELECT 语句

WAITFOR DELAY '01:02:03'SELECT * FROM Employee

其中 DELAY是在延时多长时间后才开始执行。

例 等到晚上11 点零8 分后才执行SELECT 语句

WAITFOR TIME '23:08:00'SELECT * FROM Employee

其中TIME是等到具体某个时刻才开始执行

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值