當你篩選出資料後,不免俗的會有場景會需要用到「排序」功能。在前後端分離的開發環境下,資料庫端回傳已排序後的結果,在資料量大 & 條件複雜的情境下會相當適用。畢竟在使用者端進行排序,其計算速度全部仰賴於使用者的硬體、記憶體以及程式本身,會有一定的不確定性。
基本語法如下:
/*ORDER BY 的欄位,並不一定要出現在 SELECT 中*/
SELECT <Field 1><Field 2>......
FROM <TableName>
ORDER BY <Field 1><Field 2>......
例如使用者希望將所有的商品依照成本價格由大到小排序:
由於資料庫系統本身的邏輯設計,排序是回傳結果前的最後一道手續,所以 ORDER BY 一定要放在 SELECT 敘述句的最後。
/*撰寫順序*/
SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY
假設你要同時使用以上 6 個關鍵保留字,那麼撰寫順序如上。此外,ORDER BY 並不是一定要有的,所以可不加。不過這樣一來,記錄回傳顯示的值就是隨機的,如有照順序的話,純屬巧合。
若你要在欄位的回傳的內容中,指定「由高到低、由大到小」之類的條件,那麼就需要在 ORDER BY 的指定欄位後方加上 "DESC";反之則為 "ASC"。
當只有一個排序條件時,若剛好有多筆資料符合,這麼一來這些符合條件的資料,其順序就是隨機排列了。如果不想要這種情形發生,可以指定更多的排序條件。
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;
結果會出現在最前面或是最後面,這個要看每個 SQL 資料庫系統的設計。
/*雖說撰寫順序是如下*/
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;
例如說要記錄 Product 內的各類商品總數由大到小排序,可以寫成如下:
SELECT category, COUNT(*)
FROM Product
GROUP BY category
ORDER BY COUNT(*);