1. 程式人生 > >SQL系列(五)—— 排序(order by)

SQL系列(五)—— 排序(order by)

消息 使用 選擇列 table asc 錯誤 實現 重用 應該

對查詢結果進行排序是日常應用開發中最為常見的需求,在SQL中通過order by實現。order by是select語句中一部分,即子句。

1.order by

1.1 單列排序

其實,檢索出的數據並不是隨機顯示的。如果不排序,數據一般將以它在底層表中出現的順序顯示,這有可能是數據最初添加到表中的順序。但是,如果數據隨後進行過更新或刪除,那麽這個順序將會受到DBMS重用回收存儲空間的方式的影響。

子句(clause)
SQL語句由子句構成,有些子句是必需的,有些則是可選的。一個子句通常由一個關鍵字加上所提供的數據組成。子句的例子有我們在前一
課看到的SELECT語句的FROM子句。

為了明確地排序用SELECT語句檢索出的數據,可使用ORDER BY子句。ORDER BY子句取一個或多個列的名字,據此對輸出進行排序。

從以上可以看出:

  • order by是select的子句
  • 可選
  • 可以作用在多個列上

註意點

  1. ORDER BY子句的位置:
    在指定一條ORDER BY子句時,應該保證它是SELECT語句中最後一條子句。如果它不是最後的子句,將會出現錯誤消息

  2. 通過非選擇列進行排序:
    通常,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)