MySQL - 第五章 | 排序檢索資料
準備
SQL:
1 | CREATE TABLE `products` ( |
執行:
1 | mysql> CREATE TABLE `products` ( |
排序資料
正如前一章所述,下面的SQL語句返回某個資料庫表的單個列。但請看其輸出,並沒有特定的順序。
1 | mysql> select prod_name from products; |
其實,檢索出的資料並不是以純粹的隨機順序顯示的。如果不排序,資料一般將以它在底層表中出現的順序顯示。這可以是資料最初添加到表中的順序。但是,如果資料後來進行過更新或刪除,則此順序將會受到MySQL重用回收存儲空間的影響。因此,如果不明確控制的話,不能(也不應該)依賴該排序順序。關係資料庫設計理論認為,如果不明確規定排序順序,則不應該假定檢索出的資料的順序有意義。
術語:子句(clause) SQL語句由子句構成,有些子句是必需的,而有的是可選的。一個子句通常由一個關鍵字和所提供的資料組成。子句的例子有SELECT語句的FROM子句,我們在前一章看到過這個子句。
為了明確地排序用SELECT語句檢索出的資料,可使用ORDER BY子句。ORDER BY子句取一個或多個列的名字,據此對輸出進行排序。
1 | mysql> select prod_name from products order by prod_name; |
分析:這條語句除了指示MySQL對prod_name列以字母順序排序資料的ORDER BY子句外,與前面的語句相同。
提示:通過非選擇列進行排序 通常,ORDERBY子句中使用的列將是為顯示所選擇的列。但是,實際上並不一定要這樣,用非檢索的列排序資料是完全合法的。
按多個列排序
經常需要按不止一個列進行資料排序。例如,如果要顯示僱員清單,可能希望按姓和名排序(首先按姓排序,然後在每個姓中再按名排序)。如果多個僱員具有相同的姓,這樣做很有用。
為了按多個列排序,只要指定列名,列名之間用逗號分開即可(就 像選擇多個列時所做的那樣)。
下面的程式碼檢索3個列,並按其中兩個列對結果進行排序——首先按價格,然後再按名稱排序。
1 | mysql> select id, price, prod_name from products order by price, prod_name; |
重要的是理解在按多個列排序時,排序完全按所規定的順序進行。換句話說,對於上述例子中的輸出,僅在多個行具有相同的price值時才對產品按prod_name進行排序。如果price列中所有的值都是唯一的,則不會按prod_name排序。
指定排序方向
資料排序不限於升序排序(從A到Z)。這只是默認的排序順序,還可以使用ORDER BY子句以降序(從Z到A)順序排序。為了進行降序排序, 必須指定DESC關鍵字。
下面的例子按價格以降序排序產品(最貴的排在最前面):
1 | mysql> select id, price, prod_name from products order by price desc; |
如果打算用多個列排序怎麼辦?下面的例子以降序排序產品(最貴的在最前面),然後再對產品名排序:
1 | mysql> select id, price, prod_name from products order by price desc, prod_name; |
分析:DESC關鍵字只應用到直接位於其前面的列名。在上例中,只對price列指定DESC,對prod_name列不指定。因此,price列以降序排序,而prod_name列(在每個價格內)仍然按標準的升序排序。
提示:在多個列上降序排序 如果想在多個列上進行降序排序,必須對每個列指定DESC關鍵字。
與DESC相反的關鍵字是ASC(ASCENDING),在升序排序時可以指定它。但實際上,ASC沒有多大用處,因為升序是默認的(如果既不指定ASC也不指定DESC,則假定為ASC)。
提示:區分大小寫和排序順序 在對文本性的資料進行排序時,A與a相同嗎?a位於B之前還是位於Z之後?這些問題不是理論問題,其答案取決於資料庫如何設置。
在字典(dictionary)排序順序中,A被視為與a相同,這是MySQL(和大多數資料庫管理系統)的默認行為。但是,許多資料庫管理員能夠在需要時改變這種行為(如果你的資料庫包含大量外語字符,可能必須這樣做)。
這裡,關鍵的問題是,如果確實需要改變這種排序順序,用簡單的ORDER BY子句做不到。你必須請求資料庫管理員的幫助。
使用ORDER BY和LIMIT的組合,能夠找出一個列中最高或最低的值。
下面的例子演示如何找出最昂貴物品的值:
1 | mysql> select id, price, prod_name from products order by price desc limit 1; |
分析:price DESC保證行是按照由最昂貴到最便宜檢索的,而LIMIT 1告訴MySQL僅返回一行。
注意:ORDERBY子句的位置 在給出ORDERBY子句時,應該保證它位於FROM子句之後。如果使用LIMIT,它必須位於ORDER BY之後。使用子句的次序不對將產生錯誤消息。
結語
這邊在對排序上特別做說明,這個排序往往最常使用在專案上的日期部分,像是註冊的時間排序,或是每日每月的報表產出的排序。
而其中我覺得比較要特別說的就是大小寫的部分,這在開發專案的過程中,必須要在一開始就定義好,因為在專案開發會需要接觸不同的資料庫,每個資料庫特性又不同,這點在處理的時候要特別小心。
註:以上參考了
MySQL必知必会 MySQL Crash Course