6個SQL查詢小技巧
點擊關(guān)注上方“SQL數(shù)據(jù)庫開發(fā)”,
設(shè)為“置頂或星標”,第一時間送達干貨
問題:假設(shè)有張學生成績表(tb)如下:

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

代碼:
WITH tb(姓名,課程,分數(shù)) AS
(
SELECT?N'張三',N'語文',74
UNION?ALL
SELECT?N'張三',N'數(shù)學',83
UNION?ALL
SELECT?N'張三',N'物理',93
UNION?ALL
SELECT?N'李四',N'語文',79
UNION?ALL
SELECT?N'李四',N'數(shù)學',86
UNION?ALL
SELECT?N'李四',N'物理',88
)
SELECT?姓名 ,
MAX(CASE?課程 WHEN?'語文'?THEN?分數(shù) ELSE?0?END) 語文,
MAX(CASE?課程 WHEN?'數(shù)學'?THEN?分數(shù) ELSE?0?END) 數(shù)學,
MAX(CASE?課程 WHEN?'物理'?THEN?分數(shù) ELSE?0?END) 物理
FROM?tb GROUP?BY??姓名2、分頁
方案一:利用NOT IN和SELECT TOP分頁語句形式
SELECT?TOP 10?* FROM?TestTable
WHERE?ID?NOT?IN
(SELECT?TOP 20?ID?FROM?TestTable ORDER?BY?ID)
ORDER?BY?ID?方案二:利用ID大于多少和SELECT TOP分頁語句形式
SELECT?TOP 10?* FROM?TestTable
WHERE?ID?> (
SELECT?MAX(id) FROM?
(SELECT?TOP 20?id?FROM?
TestTable ORDER?BY?id) AS?T)
ORDER?BY?ID方案三:利用SQL Server中的特性ROW_NUMBER進行分頁?
SELECT?* FROM?(
??SELECT?ROW_NUMBER() OVER(ORDER?BY?ID?DESC) AS?ROWID,*
??FROM?TestTable
) AS?mytable where?ROWID?between?21?and?403、結(jié)果合并
合并重復(fù)行
SELECT?* FROM?A
UNION
SELECT?* FROM?B不合并重復(fù)行
SELECT?* FROM?A
UNION?ALL
SELECT?* FROM?B4、隨機排序
SELECT?* FROM?TestTable ORDER?BY?NEWID()還可以結(jié)合TOP取隨機的前N條記錄
SELECT?TOP 100?* FROM?TestTable ORDER?BY?NEWID()5、以任意符號分隔取兩邊數(shù)據(jù)
例如我們以逗號(,)來分割數(shù)據(jù),將如下數(shù)據(jù)

分割成如下圖所示:

SELECT?R,
CASE?WHEN??CHARINDEX(',',R)>1?THEN??LEFT(R,CHARINDEX(',',R)-1) ELSE?NULL?END?AS?R1 ,
CASE?WHEN?CHARINDEX(',',R)>1?THEN?RIGHT(R,(LEN(R) - CHARINDEX(',',R))) ELSE?NULL?END?AS?R2
FROM??t代碼較長,我們對代碼進行拆分來理解:
SELECT??CHARINDEX(',',',') --結(jié)果是1
SELECT??CHARINDEX(',','NULL') --結(jié)果是0
SELECT??CHARINDEX(',','') --結(jié)果是0
SELECT??CHARINDEX(',','A,B') --結(jié)果是2
SELECT??LEN('A,B') --結(jié)果是3
SELECT??LEN('A,B') - CHARINDEX(',','A,B') --結(jié)果是3-2=1
SELECT??RIGHT('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?* FROM?Employee其中 DELAY是在延時多長時間后才開始執(zhí)行。
例?等到晚上11?點零8?分后才執(zhí)行SELECT?語句
WAITFOR TIME '23:08:00'
SELECT?* FROM?Employee其中TIME是等到具體某個時刻才開始執(zhí)行
我是岳哥,最后給大家分享我寫的SQL兩件套:《SQL基礎(chǔ)知識第二版》和《SQL高級知識第二版》的PDF電子版。里面有各個語法的解釋、大量的實例講解和批注等等,非常通俗易懂,方便大家跟著一起來實操。
有需要的讀者可以下載學習,在下面的公眾號「數(shù)據(jù)前線」(非本號)后臺回復(fù)關(guān)鍵字:SQL,就行
數(shù)據(jù)前線 ——End——
后臺回復(fù)關(guān)鍵字:1024,獲取一份精心整理的技術(shù)干貨
后臺回復(fù)關(guān)鍵字:進群,帶你進入高手如云的交流群。
推薦閱讀

