几个SQL查询小技巧,你会吗?

发表于:2021-12-10 09:34

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:丶平凡世界    来源:SQL数据库开发

  行列转换
  问题:假设有张学生成绩表(tb)如下:
  想变成(得到如下结果):
  代码:
  WITH tb(姓名,课程,分数) AS 
  ( 
  SELECT N'张三',N'语文',74 
  UNION ALL 
  SELECT N'张三',N'数学',83 
  UNION ALL 
  SELECT N'张三',N'物理',93 
  UNION ALL 
  SELECT N'李四',N'语文',79 
  UNION ALL 
  SELECT N'李四',N'数学',86 
  UNION ALL 
  SELECT 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 TestTable 
  WHERE 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() 
  以任意符号分隔取两边数据
  例如我们以逗号(,)来分割数据,将如下数据:
  分割成如下图所示:
  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 R2 
  FROM  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是等到具体某个时刻才开始执行。

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号