小言_互联网的博客

6个SQL查询小技巧

353人阅读  评论(0)

点击关注上方“SQL数据库开发”,

设为“置顶或星标”,第一时间送达干货

1、行列转换

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

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

代码:


   
  1. WITH tb(姓名,课程,分数) AS
  2. (
  3. SELECT N '张三',N '语文', 74
  4. UNION ALL
  5. SELECT N '张三',N '数学', 83
  6. UNION ALL
  7. SELECT N '张三',N '物理', 93
  8. UNION ALL
  9. SELECT N '李四',N '语文', 79
  10. UNION ALL
  11. SELECT N '李四',N '数学', 86
  12. UNION ALL
  13. SELECT N '李四',N '物理', 88
  14. )
  15. SELECT 姓名 ,
  16. MAX(CASE 课程 WHEN  '语文' THEN 分数 ELSE  0 END) 语文,
  17. MAX(CASE 课程 WHEN  '数学' THEN 分数 ELSE  0 END) 数学,
  18. MAX(CASE 课程 WHEN  '物理' THEN 分数 ELSE  0 END) 物理
  19. FROM tb GROUP BY  姓名

2、分页

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


   
  1. SELECT TOP 10 * FROM TestTable
  2. WHERE ID NOT IN
  3. (SELECT TOP 20 ID FROM TestTable ORDER BY ID)
  4. ORDER BY ID

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


   
  1. SELECT TOP 10 * FROM TestTable
  2. WHERE ID > (
  3. SELECT MAX(id) FROM 
  4. (SELECT TOP 20 id FROM 
  5. TestTable ORDER BY id) AS T)
  6. ORDER BY ID

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


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

3、结果合并

合并重复行


   
  1. SELECT * FROM A
  2. UNION
  3. SELECT * FROM B

不合并重复行


   
  1. SELECT * FROM A
  2. UNION ALL
  3. SELECT * FROM B

4、随机排序

SELECT * FROM TestTable ORDER BY NEWID()

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

SELECT TOP 100 * FROM TestTable ORDER BY NEWID()

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

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

分割成如下图所示:


   
  1. SELECT R,
  2. CASE WHEN  CHARINDEX( ',',R)> 1 THEN  LEFT(R,CHARINDEX( ',',R) -1) ELSE NULL END AS R1 ,
  3. CASE WHEN CHARINDEX( ',',R)> 1 THEN RIGHT(R,(LEN(R) - CHARINDEX( ',',R))) ELSE NULL END AS R2
  4. FROM  t

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


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

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

6、WAITFOR延时执行

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


   
  1. WAITFOR DELAY '01:02:03'
  2. SELECT * FROM Employee

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

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


   
  1. WAITFOR TIME '23:08:00'
  2. SELECT * FROM Employee

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


   
  1. 我是岳哥,最后给大家分享我写的SQL两件套:《SQL基础知识第二版》和《SQL高级知识第二版》的PDF电子版。里面有各个语法的解释、大量的实例讲解和批注等等,非常通俗易懂,方便大家跟着一起来实操。有需要的读者可以下载学习,在下面的公众号「数据前线」(非本号)后台回复关键字:SQL,就行数据前线
  2. ——End——
  3. 后台回复关键字: 1024,获取一份精心整理的技术干货
  4. 后台回复关键字:进群,带你进入高手如云的交流群。
  5. 推荐阅读
  6. 27岁发明SQL以后,上帝把他带走了
  7. 微信 8.0不好玩?那可能是你打开方式不正确!
  8. 一个员工的离职成本有多恐怖!
  9. SQL养成这些好习惯是一笔财富
  10. MySQL基本知识点梳理和查询优化

转载:https://blog.csdn.net/liyue071714118/article/details/113623294
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场