当前位置: 首页 > 科技观察

6个SQL查询技巧

时间:2023-03-12 10:18:58 科技观察

1.行列转换问题:假设有一个学生成绩表(tb)如下:想变成(得到如下结果):代码:WITHtb(name,course,score)AS(SELECTN'sheetThree',N'Chinese',74UNIONALLSELECTN'张三',N'数学',83UNIONALLSELECTN'张三',N'物理',93UNIONALLSELECTN'李四',N'国语',79UNIONALLSELECTN'李四',N'数学',86UNIONALLSELECTN'李四',N'物理',88)SELECTname,MAX(CASEcourseWHEN'Chinese'THENscoreELSE0END)Chinese,MAX(CASEcourseWHEN'mathematics'THENscoreELSE0END)mathematics,MAX(CASEcourseWHEN'physics'THENscoreELSE0END)physicalFROMtbGROUPBYname2.分页方案1:使用NOTIN和SELECTTOP分页语句形式SELECTTOP10*FROMTestTableWHEREIDNOTIN(SELECTTOP20IDFROMTestTableORDERBYID)ORDERBYID方案2:使用ID大于多少和SELECTTOPREID分页语句形式SELECTTOP10*HEROMTestTableW(SELECTMAX(id)FROM(SELECTTOP20idFROMTestTableORDERBYid)AST)ORDERBYID方案三:使用SQLSe中的ROW_NUMBER特性rvertopaginateSELECT*FROM(SELECTROW_NUMBER()OVER(ORDERBYIDDESC)ASROWID,*FROMTestTable)ASmytablewhereROWID在21和403LE之间合并结果,用LESSECTON*FROM合并重复行*FROMB不合并重复行SELECT*FROMAUNIONALLSELECT*FROMB4,随机排序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延迟执行示例Wait1SELECT语句WAITFORDELAY'01:02:03'SELECT*FROMEmployee将在小时2分3秒后执行,其中DELAY是执行前的延迟。示例等到晚上11:08。执行SELECT语句WAITFORTIME'23:08:00'SELECT*FROMEmployee,其中TIME是等到特定时间执行

猜你喜欢