關鍵字:ORDER, ASC, DESC
1. ORDER BY子句
SELECT columnlist
FROM tablelist
ORDER BY columnlist
強調:ORDER BY子句總在FROM子句後面, FROM子句總在關鍵字SELECT後面。
columnlist可以是任意多的列,包括單個的列,或者複雜的表達式。SELECT後面和ORDER BY後面的列可以完全不同。
示例:表Customers
CustomerID FirstName LastName
------------------------------------------------------------
1 William Smith
2 Janet Smith
3 Natalie Lopez
4 Brenda Harper
a. 升序排序:
SELECT
FirstName,LastName
FROM Customers
ORDER BY LastName
結果
FirstName LastName
------------------------------------------
Brenda Harper
Natalie Lopez
William Smith
Janet Smith
有兩個人的LastName相同,所以這種情況下結果誰先誰後是無法預料的。
ASC關鍵字:ascending,表示升序,其實默認升序所以多數沒必要
SELECT
FirstName,LastName
FROM Customers
ORDER BY LastName ASC
b. 降序排序
使用關鍵字DESC(descending)
SELECT
FirstName,LastName
FROM Customers
ORDER BY LastName DESC
結果
FirstName LastName
------------------------------------------
Janet Smith
William Smith
Natalie Lopez
Brenda Harper
c. 根據多列來排序
如示例,有兩個人的LastName都是Smith,可以添加一個列來排序:
SELECT
FirstName,LastName
FROM Customers
ORDER BY LastName, FirstName
ORDER BY子句的列名先後順序很重要:先按照LastName排序,遇到LastName相同的,再按照FirstName排序,以此類推。
結果:
FirstName LastName
------------------------------------------
Brenda Harper
Natalie Lopez
Janet Smith
William Smith
d. 根據計算字段來排序
SELECT
LastName +’,’ + FirstName AS‘Name’
FROM Customers
ORDER BY Name
結果:
Name
--------------------------
Harper, Brenda
Lopez, Natalie
Smith,Janet
Smith, William
連接後 ’Smith,Janet’ 的字典序是比‘Smith, William’ 要小的。
計算字段也可以放在ORDER BY子句中:
SELECT
FirstName,LastName
FROM Customers
ORDER BY LastName + FirstName
結果:
FirstName LastName
-------------------------------------------
Harper Brenda
Lopez Natalie
Smith Janet
Smith William
強調:這些升降序排序都沒有考慮大小寫,也就是dog可能排在DOG前面,也可能在後面。
e. 排列序列的更多內容
數據庫允許用戶指定或定製排序規則設置,設置一般遵循3個原則:
(1)升序排序時,NULL值的數據最先出現。NULL ->數字 -> 字符;降序時,字符-> 數字->NULL值
(2)字符數據:大小寫不區分
(3)字符數據:字典序
與SQL Server和MySQL不同,Oracle中NULL值在最後。可以添加關鍵字NULLS FIRST讓NULL在升序中最先出現。用在降序排序中NULL值和通常一樣,還是在最後。此外,Oracle不同的是會區分大小寫。升序中,大寫先於小寫。
示例:表Customers
TableID CharacterData NumericData
------------------------------------------------------------
1 23 23
2 5 5
3 Dog NULL
4 NULL -6
CharacterData定義爲字符列(比如VARCHAR型,可變長度數據類型)NumericData定義爲數值列(如INT型,整數),沒有數據:NULL
SELECT
NumericData
FROM tablename
ORDER BYNumericData
結果:
NumericData
-------------------
NULL
-6
5
23
如果用戶希望把代表沒有數據的NULL表示爲0,那麼
SELECT
ISNULL (NumericData, 0)
FROM tablename
ORDER BY ISNULL (NumericData, 0)
注意如果沒有用別名,在ORDER BY子句也要用同樣的ISNULL轉換類型
或者
SELECT
ISNULL (NumericData, 0) AS‘Numeric’
FROM tablename
ORDER BYISNULL Numeric
結果:
NumericData
-------------------
-6
0
5
23
如果使用CharacterData排序:
SELECT
CharacterData
FROM tablename
ORDER BY CharacterData DESC
結果
NumericData
-------------------
Dog
5
23
NULL
PS 5排在23前面是因爲它們是字符列,按照字典序(按照單個字符從左到右比較),5比23“大”,故降序排列在前。