您的位置:首頁(yè) >聚焦 >

幾個(gè)SQL查詢小技巧_當(dāng)前觀點(diǎn)

2022-11-22 06:33:53    來(lái)源:程序員客棧

點(diǎn)擊關(guān)注公眾號(hào),SQL干貨及時(shí)獲取

后臺(tái)回復(fù):1024,獲取海量學(xué)習(xí)資源1、行列轉(zhuǎn)換

問(wèn)題:假設(shè)有張學(xué)生成績(jī)表(tb)如下:


【資料圖】

想變成(得到如下結(jié)果):

代碼:

WITH tb(姓名,課程,分?jǐn)?shù)) AS(SELECTN"張三",N"語(yǔ)文",74UNIONALLSELECTN"張三",N"數(shù)學(xué)",83UNIONALLSELECTN"張三",N"物理",93UNIONALLSELECTN"李四",N"語(yǔ)文",79UNIONALLSELECTN"李四",N"數(shù)學(xué)",86UNIONALLSELECTN"李四",N"物理",88)SELECT姓名 ,MAX(CASE課程 WHEN"語(yǔ)文"THEN分?jǐn)?shù) ELSE0END) 語(yǔ)文,MAX(CASE課程 WHEN"數(shù)學(xué)"THEN分?jǐn)?shù) ELSE0END) 數(shù)學(xué),MAX(CASE課程 WHEN"物理"THEN分?jǐn)?shù) ELSE0END) 物理FROMtb GROUPBY姓名

2、分頁(yè)

方案一:利用NOT IN和SELECT TOP分頁(yè)語(yǔ)句形式

SELECTTOP 10* FROMTestTableWHEREIDNOTIN(SELECTTOP 20IDFROMTestTable ORDERBYID)ORDERBYID

方案二:利用ID大于多少和SELECT TOP分頁(yè)語(yǔ)句形式

SELECTTOP 10* FROMTestTableWHEREID> (SELECTMAX(id) FROM(SELECTTOP 20idFROMTestTable ORDERBYid) AST)ORDERBYID

方案三:利用SQL Server中的特性ROW_NUMBER進(jìn)行分頁(yè)

SELECT* FROM(SELECTROW_NUMBER() OVER(ORDERBYIDDESC) ASROWID,*FROMTestTable) ASmytable whereROWIDbetween21and40

3、結(jié)果合并

合并重復(fù)行

SELECT* FROMAUNIONSELECT* FROMB

不合并重復(fù)行

SELECT* FROMAUNIONALLSELECT* FROMB

4、隨機(jī)排序

SELECT* FROMTestTable ORDERBYNEWID()

還可以結(jié)合TOP取隨機(jī)的前N條記錄

SELECTTOP 100* FROMTestTable ORDERBYNEWID()

5、以任意符號(hào)分隔取兩邊數(shù)據(jù)

例如我們以逗號(hào)(,)來(lái)分割數(shù)據(jù),將如下數(shù)據(jù)

分割成如下圖所示:

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

代碼較長(zhǎng),我們對(duì)代碼進(jìn)行拆分來(lái)理解:

SELECTCHARINDEX(",",",") --結(jié)果是1SELECTCHARINDEX(",","NULL") --結(jié)果是0SELECTCHARINDEX(",","") --結(jié)果是0SELECTCHARINDEX(",","A,B") --結(jié)果是2SELECTLEN("A,B") --結(jié)果是3SELECTLEN("A,B") - CHARINDEX(",","A,B") --結(jié)果是3-2=1SELECTRIGHT("A,B",( LEN("A,B") - CHARINDEX(",","A,B"))) --結(jié)果是 B

最后一步我們將"A,B"拆分出來(lái)了B,同理A我們也可以用類似的方法獲取到。

6、WAITFOR延時(shí)執(zhí)行

例 等待1小時(shí)2分零3秒后才執(zhí)行SELECT語(yǔ)句

WAITFOR DELAY "01:02:03"SELECT* FROMEmployee

其中 DELAY是在延時(shí)多長(zhǎng)時(shí)間后才開(kāi)始執(zhí)行。

例等到晚上11點(diǎn)零8分后才執(zhí)行SELECT語(yǔ)句

WAITFOR TIME "23:08:00"SELECT* FROMEmployee

其中TIME是等到具體某個(gè)時(shí)刻才開(kāi)始執(zhí)行

我是岳哥,最后給大家分享我寫(xiě)的SQL兩件套:《SQL基礎(chǔ)知識(shí)第二版》和《SQL高級(jí)知識(shí)第二版》的PDF電子版。里面有各個(gè)語(yǔ)法的解釋、大量的實(shí)例講解和批注等等,非常通俗易懂,方便大家跟著一起來(lái)實(shí)操。

有需要的讀者可以下載學(xué)習(xí),在下面的公眾號(hào)「數(shù)據(jù)前線」(非本號(hào))后臺(tái)回復(fù)關(guān)鍵字:SQL,就行

數(shù)據(jù)前線——End——

后臺(tái)回復(fù)關(guān)鍵字:1024,獲取一份精心整理的技術(shù)干貨

后臺(tái)回復(fù)關(guān)鍵字:進(jìn)群,帶你進(jìn)入高手如云的交流群。

推薦閱讀

SQL 中為什么經(jīng)常要加NOLOCK?SQL 語(yǔ)句中 where 條件后 寫(xiě)上1=1 是什么意思干掉visio,這個(gè)畫(huà)圖神器真的絕了!?。QL中的高級(jí)日期函數(shù)SQL常用腳本整理

關(guān)鍵詞: 開(kāi)始執(zhí)行 是什么意思 通俗易懂

相關(guān)閱讀