標籤:price http 理論 apt 問題 利用 5.4 管理員 多資料庫
第五章 排序檢索資料
本章將講授如何使用SELECT語句的ORDER BY子句,根據需要排序檢索出的資料。
5.1 排序資料
正如前一章所述,下面的SQL語句返回某個資料庫表的單個列。但請看其輸出,並沒有特定的順序。
其實,檢索出的資料並不是以純粹的隨機順序顯示的。如果不排序,資料一般將以它在底層表中出現的順序顯示。這可以是資料最初添加到表中的順序。但是,如果資料後來進行過更新或刪除,則此順序將會受到MySQL重用回收儲存空間的影響。因此,如果不明確控制的話,不能(也不應該)依賴該排序次序。關聯式資料庫設計理論認為,如果不明確規定排序次序,則不應該假定檢索出的資料的順序有意義。
子句(clause) SQL語句由子句構成,有些子句是必需的,而有的是可選的。一個子句通常由一個關鍵字和所提供的資料群組成。子句的例子有SELECT語句的FROM子句,我們在前一章看到過這個子句。為了明確地排序用SELECT語句檢索出的資料,可使用ORDER BY子句。ORDER BY子句取一個或多個列的名字,據此對輸出進行排序。請看下面的例子:
這條語句除了指示MySQL對prod_name列以字母順序排序資料的ORDER BY子句外,與前面的語句相同。
通過非選擇列進行排序 通常, ORDER BY子句中使用的列將是為顯示所選擇的列。但是,實際上並不一定要這樣,用非檢索的列排序資料是完全合法的。
5.2 按多個列排序
經常需要按不止一個列進行資料排序。例如,如果要顯示僱員清單,可能希望按姓和名排序(首先按姓排序,然後在每個姓中再按名排序)。如果多個僱員具有相同的姓,這樣做很有用。為了按多個列排序,只要指定列名,列名之間用逗號分開即可(就像選擇多個列時所做的那樣)。下面的代碼檢索3個列,並按其中兩個列對結果進行排序——首先按價格,然後再按名稱排序。
重要的是理解在按多個列排序時,排序完全按所規定的順序進行。換句話說,對於上述例子中的輸出,僅在多個行具有相同的prod_price值時才對產品按prod_name進行排序。如果prod_price列中所有的值都是唯一的,則不會按prod_name排序。
5.3 指定排序方向
資料排序不限於升序排序(從A到Z)。這隻是預設的排序次序,還可以使用ORDER BY子句以降序(從Z到A)順序排序。為了進行降序排序,必須指定DESC關鍵字。下面的例子按價格以降序排序產品(最貴的排在最前面):
但是,如果打算用多個列排序怎麼辦?下面的例子以降序排序產品(最貴的在最前面),然後再對產品名排序:
DESC關鍵字只應用到直接位於其前面的列名。在上例中,只對prod_price列指定 DESC,對 prod_name列不指定。因此,prod_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的組合,能夠找出一個列中最高或最低的值。下面的例子示範如何找出最昂貴物品的值:
prod_price DESC保證行是按照由最昂貴到最便宜檢索的,而LIMIT 1告訴MySQL僅返回一行。
ORDER BY子句的位置 在給出ORDER BY子句時,應該保證它位於FROM子句之後。如果使用LIMIT,它必須位於ORDER BY之後。使用子句的次序不對將產生錯誤訊息。
5.4 小結
本章學習了如何用SELECT語句的ORDER BY子句對檢索出的資料進行排序。這個子句必須是SELECT語句中的最後一條子句。可根據需要,利用它在一個或多個列上對資料進行排序。
MySQL必知應會-第5章-排序檢索資料