iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 22
0

當你篩選出資料後,不免俗的會有場景會需要用到「排序」功能。在前後端分離的開發環境下,資料庫端回傳已排序後的結果,在資料量大 & 條件複雜的情境下會相當適用。畢竟在使用者端進行排序,其計算速度全部仰賴於使用者的硬體、記憶體以及程式本身,會有一定的不確定性。

ORDER BY

基本語法如下:

/*ORDER BY 的欄位,並不一定要出現在 SELECT 中*/
SELECT <Field 1><Field 2>......
FROM <TableName>
ORDER BY <Field 1><Field 2>...... 

例如使用者希望將所有的商品依照成本價格由大到小排序:
Day22Result1

由於資料庫系統本身的邏輯設計,排序是回傳結果前的最後一道手續,所以 ORDER BY 一定要放在 SELECT 敘述句的最後。

/*撰寫順序*/
SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY

假設你要同時使用以上 6 個關鍵保留字,那麼撰寫順序如上。此外,ORDER BY 並不是一定要有的,所以可不加。不過這樣一來,記錄回傳顯示的值就是隨機的,如有照順序的話,純屬巧合。

指定升冪(ASC)或降冪(DESC)排列

若你要在欄位的回傳的內容中,指定「由高到低、由大到小」之類的條件,那麼就需要在 ORDER BY 的指定欄位後方加上 "DESC";反之則為 "ASC"。

  • SQL 資料庫預設為 ASC 條件
  • ASC:Ascendent,升冪
  • DESC:Descendent,降冪

指定多個排序條件

當只有一個排序條件時,若剛好有多筆資料符合,這麼一來這些符合條件的資料,其順序就是隨機排列了。如果不想要這種情形發生,可以指定更多的排序條件。

SELECT <Field 1><Field 2>......
FROM <TableName>
ORDER BY <Field 1><Field 2>...... /*先照 Field 1 排序,若相同則再按 Field 2*/

若希望將商品先依照日期由新到舊排序,再依照商品價格由大到小的話,就會下以下的指令:

SELECT * FROM Product ORDER BY purchase_date DESC, cost_price DESC;

Day22Result2

如果排序結果有 NULL 呢?

結果會出現在最前面或是最後面,這個要看每個 SQL 資料庫系統的設計。
Day22Result3

可以使用別名 AS 的名稱來排序

/*雖說撰寫順序是如下*/
SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY
/*但實際執行會像是*/
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY

所以在撰寫 SELECT 指令所使用的別名,可以被 ORDER BY 使用。

SELECT id AS product_id, name, sell_price FROM Product ORDER BY product_id ASC;

Day22Result4

可以使用函數

例如說要記錄 Product 內的各類商品總數由大到小排序,可以寫成如下:

SELECT category, COUNT(*) 
FROM Product 
GROUP BY category 
ORDER BY COUNT(*);

Day22Result5


上一篇
Day21 - 對資料分群內的資料下條件
下一篇
Day23 - 新增資料表和資料
系列文
SQL 30天手把手入門30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言