SQL系列(五)—— 排序(order by)
對查詢結果進行排序是日常應用開發中最為常見的需求,在SQL中通過order by實現。order by是select語句中一部分,即子句。
1.order by
1.1 單列排序
其實,檢索出的數據並不是隨機顯示的。如果不排序,數據一般將以它在底層表中出現的順序顯示,這有可能是數據最初添加到表中的順序。但是,如果數據隨後進行過更新或刪除,那麽這個順序將會受到DBMS重用回收存儲空間的方式的影響。
子句(clause)
SQL語句由子句構成,有些子句是必需的,有些則是可選的。一個子句通常由一個關鍵字加上所提供的數據組成。子句的例子有我們在前一
課看到的SELECT語句的FROM子句。
為了明確地排序用SELECT語句檢索出的數據,可使用ORDER BY子句。ORDER BY子句取一個或多個列的名字,據此對輸出進行排序。
從以上可以看出:
- order by是select的子句
- 可選
- 可以作用在多個列上
註意點
ORDER BY子句的位置:
在指定一條ORDER BY子句時,應該保證它是SELECT語句中最後一條子句。如果它不是最後的子句,將會出現錯誤消息通過非選擇列進行排序:
通常,ORDER BY子句中使用的列將是為顯示而選擇的列。但是,實際上並不一定要這樣,用非檢索的列排序數據是完全合法的
1.2多列排序
order by不僅可以作用在單列上進行排序,還可以實現對多列排序。要按多個列排序,簡單指定列名,列名之間用逗號分開即可(就像選擇多個列時那樣)。
排序的優先級:按照order by後面緊隨的列依次遞減。
1.3指定排序方向
數據排序不限於升序排序(從A到Z),這只是默認的排序順序。還可以使用ORDER BY子句進行降序(從Z到A)排序。為了進行降序排序,必須
指定DESC關鍵字。默認是升序。
2實踐
2.1 order by簡單使用
如果不排序的查詢,如:
select * from student;
結果如:
name | age |
---|---|
lxy | 20 |
son | 1 |
wly | 18 |
如果進行排序:
select * from student order by age;
結果如:
name | age |
---|---|
son | 1 |
wly | 18 |
lxy | 20 |
根據age進行了從大到小的排序,即升序排序。
再來看下排序不檢索的列:
select name from student order by age;
結果如:
name |
---|
son |
wly |
lxy |
檢索出的結果和上面的順序保持一樣。
2.2多列排序實踐
select * from student;
結果如下:
name | age |
---|---|
lxy | 20 |
lxy | 10 |
lxy | 25 |
son | 1 |
wly | 18 |
wly | 16 |
如果按照name,age進行排序:
select * from student order by name, age;
結果如下:
name | age |
---|---|
lxy | 10 |
lxy | 20 |
lxy | 25 |
son | 1 |
wly | 16 |
wly | 18 |
從以上的兩個結果中可以看出優先級。先對結果按照name排序,然後再對相同name的結果,按照age排序。
2.3指定排序方向
select * from student order by name;
select * from student order by name asc;
以上兩條查詢結果一致:
name | age |
---|---|
lxy | 20 |
lxy | 10 |
lxy | 25 |
son | 1 |
wly | 18 |
wly | 16 |
如果按照降序排序:
select * from student order by name desc;
結果如下:
name | age |
---|---|
wly | 18 |
wly | 16 |
son | 1 |
lxy | 20 |
lxy | 10 |
lxy | 25 |
參考
《SQL必知必會》
SQL系列(五)—— 排序(order by)