<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          6個SQL查詢小技巧

          共 2274字,需瀏覽 5分鐘

           ·

          2021-02-05 09:45

          點擊關(guān)注上方“SQL數(shù)據(jù)庫開發(fā)”,

          設(shè)為“置頂或星標”,第一時間送達干貨

          1、行列轉(zhuǎn)換

          問題:假設(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?40


          3、結(jié)果合并

          合并重復(fù)行


           SELECT?* FROM?A
          UNION
          SELECT?* FROM?B


          不合并重復(fù)行

          SELECT?* FROM?A
          UNION?ALL
          SELECT?* FROM?B


          4、隨機排序

          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)鍵字:進群,帶你進入高手如云的交流群。

          推薦閱讀

          瀏覽 44
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  污污免费网站 | 九九精品九九视频 | 日韩大逼 | 一级A级黄色片 | 国产插比网 |