SQL Server基礎:TOP、OFFSET-FETCH、SET ROWCOUNT用法筆記
今天給大家介紹一下TOP、OFFSET-FETCH、SET ROWCOUNT用法筆記,希望對大家能有所幫助!
1、 TOP用法
語法格式:TOP ( expression ) [ PERCENT ] [ WITH TIES ]
- expression:返回行數的數值表達式
- PERCENT:指返回的結果集行的百分比。
用法:
- --從UserInfo數據表提取20行記錄
- SELECT TOP 20 * FROM UserInfo;
- --UserInfo數據表提取10%行記錄
- SELECT TOP 10 PERCENT * FROM UserInfo;
表達式中指定返回的行數或百分比,則必須將表達式包含在括號內。用法如下:
- DECLARE @n AS int;
- SET @n = 12
- SELECT TOP (@n) *
- FROM UserInfo ;
注意:在未指定ORDER BY子句的情況下,TOP子句返回的數據行,是那些在物理循序上優先訪問到的行,而并不一定是邏輯上的前幾行。簡單來說,這種返回結果具有不確定性。即使指定了ORDER BY子句,但是所指定的排序列中含有重復值,返回的結果也具有不確定性。不確定的數據,對于數據使用而言,沒有多少價值。解決列中存在重復值時返回結果的不確定性問題,可以使用WITH TIES 關鍵字。該關鍵字將指定返回包含ORDER BY子句返回的最后一個值的所有行,這樣將超過expression指定的數量。示例:
- SELECT TOP 2 WITH TIES
- FROM UserInfo
- ORDER BY CreateDate
2、OFFSET-FETCH用法
SQL Server 2012版本引入了對OFFSET-FETCH技術的支持。OFFSET-FETCH篩選通常被視為ORDER BY子句的一部分,通常用于實現按順序分頁顯示效果。OFFSET指定要跳過的行數,FETCH指定在跳過的行數后要篩選的行數用法:
- SELECT UserID, Birthday, Name,Age
- FROM UserInfo
- ORDER UserID
- OFFSET 20 ROWS FETCH NEXT 15 ROWS ONLY;
注意:使用OFFSET-FETCH的查詢必須具有ORDER BY子句。此外,FETCH子句也必須有OFFSET子句。如果不想跳過任何行,但是希望使用FETCH篩選,可以使用OFFSET 0 ROWS來表示。不過,單獨使用FETCH表示跳過指定的行數,并返回查詢結果中所有剩余行。OFFSET-FETCH語法有一些有趣的語言方面需要注意。單數格式ROW和復數格式ROWS是可以互換的,因此能夠以直觀的類似英語方式來描述篩選。例如,假設僅希望獲取一行,如果指定了FETCH 1 ROWS,雖然這在語法上是有效的,不過看上去會很怪。因此,可以使用FETCH 1 ROW格式。此互換同樣適用于OFFSET子句。另外,如果不希望跳過任何行(OFFSET 0 ROWS),可能覺得“first”比“next”更合適,因此,FIRST和NEXT格式是可以互換的。從支持跳過功能看,OFFSET-FETCH子句比TOP子句更靈活。但OFFSET-FETCH不支持PERCENT和WITH TIES選項,而TOP支持。由于OFFSET-FETCH是標準的,而TOP不是,建議使用OFFSET-FETCH作為默認選擇,除非你需要TOP支持且OFFSET-FETCH不支持的功能。
3、SET ROWCOUNT語句
SET ROWCOUNT n 語句限制結果集的大小,該語句指定在返回指定的n行后停止處理查詢。SET ROWCOUNT與TOP的差別如下:
- SET ROWCOUNT限制適用于計算ORDER BY后在結果集中生成行。如果指定了ORDER BY,SELECT語句將從分類排序后的某個值集中選擇n行后結束。
- TOP和OFFSET-FETCH適用于單個SELECT語句。直到執行下一個SET ROWCOUNT語句前,SET ROWCOUNT設置將一直有效。如果執行SET ROWCOUNT 0將關閉該選項。
說明:TOP和OFFSET-FETCH性能要優于使用SET ROWCOUNT,應當盡量避免使用SET ROWCOUNT。用法:
- SET ROWCOUNT 4;
- SELECT TOP 20 *
- FROM UserInfo;