您的位置:首頁 >聚焦 >

幾個SQL查詢小技巧

2022-11-22 07:42:21    來源:程序員客棧

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

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

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


(資料圖片)

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

代碼:

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

2、分頁

方案一:利用NOT IN和SELECT TOP分頁語句形式

SELECTTOP 10* FROMTestTableWHEREIDNOTIN(SELECTTOP 20IDFROMTestTable ORDERBYID)ORDERBYID

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

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

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

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、以任意符號分隔取兩邊數(shù)據(jù)

例如我們以逗號(,)來分割數(shù)據(jù),將如下數(shù)據(jù)

分割成如下圖所示:

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

代碼較長,我們對代碼進(jìn)行拆分來理解:

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"拆分出來了B,同理A我們也可以用類似的方法獲取到。

6、WAITFOR延時執(zhí)行

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

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

其中 DELAY是在延時多長時間后才開始執(zhí)行。

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

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

其中TIME是等到具體某個時刻才開始執(zhí)行

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

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

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

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

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

推薦閱讀

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

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

相關(guān)閱讀