這篇主要是講一下如何使用SELECT?語句的ORDER BY子句來對檢索的結果進行排序
關于排序首先需要了解到是,當檢索出的數(shù)據(jù)沒有被我們指定排序規(guī)則的時候,數(shù)據(jù)一般是以它在底層表中出現(xiàn)的順序顯示。這個順序可能是數(shù)據(jù)被添加進數(shù)據(jù)表的順序,但是如果數(shù)據(jù)被更新了或者刪除了的話,這個順序將會受到DBMS重用回收儲存空間的方式的影響。因此,如果不明確?指定檢索數(shù)據(jù)的排序規(guī)則的話,最終的結果不能也不應該依賴默認的排序規(guī)則。關系型數(shù)據(jù)庫設計理論認為,如果不明確排序的規(guī)則,則不認為檢索出的數(shù)據(jù)的順序有任何意義。
為了明確的將SELECT語句檢索出的數(shù)據(jù)排序,可以使用 ORDER BY 子句,我們之前有提到過SQL語句中的子句,但是在這里有必要再說一點,SQL語句中的子句通常由一個關鍵字加上所提供的數(shù)據(jù)組成,比如之前用到的FROM子句。在我看來SQL?中的子句的作用就是對SQL語句的操作結果進行一些修飾,以達到想要的效果。
下面進入主題,講一講如何使用ORDER BY子句。
按某一列排序
首先來看最基本的按某一列排序,直接看下面的例子:
SELECT prod_name FROM Products ORDER BY prod_name;
結果如下:

可以看到檢索的結果已經(jīng)對prod_name按字母順序排好序了。
在使用ORDER BY子句時需要注意的是,要保證它是SELECT語句中 最后 一條子句,否則會出現(xiàn)錯誤。并且,用非檢索列(即SELECT沒有指出來的列)進行數(shù)據(jù)排序也是完全合法的。
按多個列排序
很多情況下,需要按不止一個列進行數(shù)據(jù)排序。當需要按多個列排序的時候,只需要像SELECT選擇多個列一樣指定多個列名,列名之間用逗號分開即可。看一個簡單的例子:
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price, prod_name;
結果如下:

結合這個結果可以看出來,當指定了按多個列排序的時候,會按照指定的列的順序進行排序,比如在這個例子里,首先按照prod_price進行排序,當存在多個prod_price相同的時候對?prod_name排序,否則不會對prod_name排序。
按位置排序
除了能夠使用列名為依據(jù)進行排序外,ORDER BY還支持按相對列位置進行排序。先看一個例子:
SELECT prod_id, prod_price, prod_name
FROM ?Products
ORDER BY 2, 3;
結果如下;

這個例子輸出的結果和上個例子的一樣,不同之處是在?ORDER BY子句。在這個例子里,ORDER BY子句會根據(jù)?指定的相對位置從SELECT選擇的所有的列中找到需要的列。比如這個例子中,ORDER BY會選擇第二個和第三個列即prod_price和prod_name進行排序,并且會遵循指定的順序。
使用這個方法進行排序的好處在于不需要重新輸入列名,但是其 缺點 也是顯而易見的:
- 不明確給出列名有可能造成錯用列名排序。
- 對SELECT清單進行改動時可能會忘記同時修改ORDER BY的順序,造成錯誤排序
- 如果需要進行排序的列不在SELECT清單中,也會造成錯誤。
指定排序方向
對數(shù)據(jù)?排序的默認順序是 升序 ,即從A到Z,在某些需求下,可能會需要進行 降序 排序,即Z到A,這時?必須制定 DESC(Descending的縮寫)關鍵字。
下面的例子會以價格降序來排序產(chǎn)品,即價格最高的在最上面:
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price DESC;
結果如下:

可以很明顯的看到?價格越高的產(chǎn)品越在前面。
上面這個例子只是選取了一列進行排序,在實際的使用中,肯定會遇到要用多個列進行排序的情況,這個時候需要注意到是,DESC關鍵字 只直接應用到直接位于其前面的列名。所以,如果想要在多個列上都進行降序排序的話,?需要每個列都指定DESC關鍵字,否則沒有指定DESC關鍵字的列會按照默認的升序排序。
?實際上與?DESC相對應的還有 ASC(Ascending的縮寫)關鍵字,使用這個關鍵字將會指定升序排序,但是實際使用中基本不會用到ASC關鍵字,因為默認的排序順序就是升序。
最后還有一個問題需要討論,那就是對文本性數(shù)據(jù)進行排序的時候,是否會區(qū)分大小寫。這個問題并不是理論問題,而取決于數(shù)據(jù)庫的設置方式。在 字典(dictionary)的排序中?,A被視為與a相同,這是大多數(shù)DBMS的默認行為。但是許多DBMS允許數(shù)據(jù)庫管理員在需要的時候改變這種行為。例如當數(shù)據(jù)庫里包含了大量的外語字符時,可能會需要這樣做。要改變這種順序,使用ORDER BY是無法做到的,需要向數(shù)據(jù)庫管理員求助。