T-SQL中需要使用到排序的子句


一條單表查詢的T-SQL一般包含6個字句,他們的執行順序如下:

from => where => group by => having => select => order by

ORDER BY子句

爲什麼使用order by

我們知道SQL SERVER中的表是基於關係模型的,而關係模型又是建立在集合論上面的。一個數據庫表代表一個集合(如果有重複記錄則是多集),集和是無序的,雖然有時候會發現一張表按Id排序,但不能保證每張表都會這樣。所以爲了保證結果中的行按一定順序排序,我們需要使用order by

注意點

  1. 使用了ORDER BY子句後查詢結果將不符合表的要求,因爲這時的結果中的行將具有一定的順序,ANSI稱之爲遊標,一些語言元素與運算不能處理遊標。
  2. ORDER BY是唯一能夠引用SELECT處理階段創建的別名列的階段。
  3. 文章開頭已經標明ORDER BY是在SELECT階段之後執行的,不過ORDER BY是可以指定SELECT沒有指定的元素的。但是當SELECT子句中指定了DISTINCT時,ORDER BY 只可以指定SELECT中選中的元素。

TOP選項

功能

TOP選項是T-SQL特有的,用於限制查詢返回的行數或百分比。

重點

  1. TOP選項是可以說是在ORDER BY之後執行的,因爲當在查詢中指定了ORDER BY子句時,TOP將依賴該子句來定義行的邏輯優先順序。
  2. 不能在同一查詢中既通過ORDER BY列表來爲TOP選項決定各行的邏輯優先順序,同時還想用另一個ORDER BY對輸出中的行進行排序以展示數據。
  3. TOP在DISTINCT之後執行。

PERCENT關鍵字

TOP選項中可以使用PERCENT關鍵字,在這種情況下,SQL Server會按照百分比來計算應該返回的滿足條件的行數(向上取整)。

WITH THIS關鍵字

返回和TOP返回結果的最後一行相同的其他所有行。

OVER子句

功能

OVER子句用於爲行定義一個窗口,以便進行固定的運算(指定計算的維度)。

注意點

  1. 帶有空的圓括號的OVER子句會對所有的行進行計算,這裏的所有行並不一定是在FROM子句中出現的那些表中的所有行,而是在FROM、WHERE、GROUP BY以及HAVING處理階段完成後仍然可用的那些行。
  2. OVER子句中指定的ORDER BY邏輯與數據展示沒什麼關係,並不會改變查詢結果表最終的內容。
  3. 如果在SELECT處理階段指定了開窗函數,開窗計算會在DISTINCT子句之前進行處理。

PARTITION BY

如果想對行進行限制或分區,則可以使用PARTITION BY子句。

四種排名函數

OVER子句也支持四種排名函數:ROW_NUMBER、RANK、DENSE_RANK、NTILE

ROW_NUMBER

ROW_NUMBER函數用於爲查詢的結果集中的各行分配遞增的行號,其邏輯順序通過OVER子句中的ORDER BY語句進行指定。

RANK&DENSE_RANK

與ROW_NUMBER類似,但他們爲具有相同邏輯排序值的所有行生成同樣的排名。RANK和DENSE_RANK的區別是:RANK表示之前有多少行具有更低的排序值,DENSE_RANK表示之前有多少個更低的排序值。

NTILE

NTILE函數可以把結果中的行關聯到組,併爲每一行分配一個所屬的組的編號。NTILE函數接受一個表示組的數量的輸入參數,並要在OVER子句中指定邏輯順序。
排名函數也支持在OVER子句中使用PARTITION BY語句。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章