本篇内容介绍了“有哪些SQL查询小技巧”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

1、行列转换

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

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

代码:

WITHtb(姓名,课程,分数)AS(SELECTN'张三',N'语文',74UNIONALLSELECTN'张三',N'数学',83UNIONALLSELECTN'张三',N'物理',93UNIONALLSELECTN'李四',N'语文',79UNIONALLSELECTN'李四',N'数学',86UNIONALLSELECTN'李四',N'物理',88)SELECT姓名,MAX(CASE课程WHEN'语文'THEN分数ELSE0END)语文,MAX(CASE课程WHEN'数学'THEN分数ELSE0END)数学,MAX(CASE课程WHEN'物理'THEN分数ELSE0END)物理FROMtbGROUPBY姓名

2、分页

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

SELECTTOP10*FROMTestTableWHEREIDNOTIN(SELECTTOP20IDFROMTestTableORDERBYID)ORDERBYID

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

SELECTTOP10*FROMTestTableWHEREID>(SELECTMAX(id)FROM(SELECTTOP20idFROMTestTableORDERBYid)AST)ORDERBYID

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

SELECT*FROM(SELECTROW_NUMBER()OVER(ORDERBYIDDESC)ASROWID,*FROMTestTable)ASmytablewhereROWIDbetween21and40

3、结果合并

合并重复行

SELECT*FROMAUNIONSELECT*FROMB

不合并重复行

SELECT*FROMAUNIONALLSELECT*FROMB

4、随机排序

SELECT*FROMTestTableORDERBYNEWID()

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

SELECTTOP100*FROMTestTableORDERBYNEWID()

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

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

分割成如下图所示:

SELECTR,CASEWHENCHARINDEX(',',R)>1THENLEFT(R,CHARINDEX(',',R)-1)ELSENULLENDASR1,CASEWHENCHARINDEX(',',R)>1THENRIGHT(R,(LEN(R)-CHARINDEX(',',R)))ELSENULLENDASR2FROMt

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

SELECTCHARINDEX(',',',')--结果是1SELECTCHARINDEX(',','NULL')--结果是0SELECTCHARINDEX(',','')--结果是0SELECTCHARINDEX(',','A,B')--结果是2SELECTLEN('A,B')--结果是3SELECTLEN('A,B')-CHARINDEX(',','A,B')--结果是3-2=1SELECTRIGHT('A,B',(LEN('A,B')-CHARINDEX(',','A,B')))--结果是B

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

6、WAITFOR延时执行

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

WAITFORDELAY'01:02:03'SELECT*FROMEmployee

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

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

WAITFORTIME'23:08:00'SELECT*FROMEmployee

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

“有哪些SQL查询小技巧”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!