5.1 排序數據
子句(clause) SQL語句由子句構成,有些子句是必需的,而有的是可選的。一個子句通常由一個關鍵字和所提供的數據組成。
mysql> SELECT prod_name FROM products ORDER BY prod_name;
+----------------+
| prod_name |
+----------------+
| .5 ton anvil |
| 1 ton anvil |
| 2 ton anvil |
| Bird seed |
| Carrots |
| Detonator |
| Fuses |
| JetPack 1000 |
| JetPack 2000 |
| Oil can |
| Safe |
| Sling |
| TNT (1 stick) |
| TNT (5 sticks) |
+----------------+
- 分析:這條語句除了指示MySQL對
prod_name
列以字母順序排序數據的ORDER BY
子句外,與前面的語句相同。
通過非選擇列進行排序:通常, ORDER BY子句中使用的列將是爲顯示所選擇的列。但是,實際上並不一定要這樣,用非檢索的列排序數據是完全合法的。
5.2 按多個列排序
mysql> SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price, prod_name;
+---------+------------+----------------+
| prod_id | prod_price | prod_name |
+---------+------------+----------------+
| FC | 2.50 | Carrots |
| TNT1 | 2.50 | TNT (1 stick) |
| FU1 | 3.42 | Fuses |
| SLING | 4.49 | Sling |
| ANV01 | 5.99 | .5 ton anvil |
| OL1 | 8.99 | Oil can |
| ANV02 | 9.99 | 1 ton anvil |
| FB | 10.00 | Bird seed |
| TNT2 | 10.00 | TNT (5 sticks) |
| DTNTR | 13.00 | Detonator |
| ANV03 | 14.99 | 2 ton anvil |
| JP1000 | 35.00 | JetPack 1000 |
| SAFE | 50.00 | Safe |
| JP2000 | 55.00 | JetPack 2000 |
+---------+------------+----------------+
- 分析:重要的是理解在按多個列排序時,排序完全按所規定的順序進行。換句話說,對於上述例子中的輸出,僅在多個行具有相同的
prod_price
值時纔對產品按prod_name
進行排序。如果prod_price
列中所有的值都是唯一的則不會按prod_name
排序。
5.3 指定排序方向
爲了進行降序排序,必須指定DESC關鍵字。
下面的例子按價格以降序排序產品(最貴的排在最前面):
mysql> SELECT prod_id,prod_price,prod_name FROM products ORDER BY prod_price DESC;
+---------+------------+----------------+
| prod_id | prod_price | prod_name |
+---------+------------+----------------+
| JP2000 | 55.00 | JetPack 2000 |
| SAFE | 50.00 | Safe |
| JP1000 | 35.00 | JetPack 1000 |
| ANV03 | 14.99 | 2 ton anvil |
| DTNTR | 13.00 | Detonator |
| FB | 10.00 | Bird seed |
| TNT2 | 10.00 | TNT (5 sticks) |
| ANV02 | 9.99 | 1 ton anvil |
| OL1 | 8.99 | Oil can |
| ANV01 | 5.99 | .5 ton anvil |
| SLING | 4.49 | Sling |
| FU1 | 3.42 | Fuses |
| FC | 2.50 | Carrots |
| TNT1 | 2.50 | TNT (1 stick) |
+---------+------------+----------------+
但是,如果打算用多個列排序怎麼辦?下面的例子以降序排序產品(最貴的在最前面),然後再對產品名排序:
mysql> SELECT prod_id,prod_price,prod_name FROM products ORDER BY prod_price DESC, prod_name;
+---------+------------+----------------+
| prod_id | prod_price | prod_name |
+---------+------------+----------------+
| JP2000 | 55.00 | JetPack 2000 |
| SAFE | 50.00 | Safe |
| JP1000 | 35.00 | JetPack 1000 |
| ANV03 | 14.99 | 2 ton anvil |
| DTNTR | 13.00 | Detonator |
| FB | 10.00 | Bird seed |
| TNT2 | 10.00 | TNT (5 sticks) |
| ANV02 | 9.99 | 1 ton anvil |
| OL1 | 8.99 | Oil can |
| ANV01 | 5.99 | .5 ton anvil |
| SLING | 4.49 | Sling |
| FU1 | 3.42 | Fuses |
| FC | 2.50 | Carrots |
| TNT1 | 2.50 | TNT (1 stick) |
+---------+------------+----------------+
- 分析:DESC關鍵字只應用到直接位於其前面的列名。在上例中,只對
prod_price
列指定DESC
,對prod_name
列不指定。因此,prod_price
列以降序排序,而prod_name
列(在每個價格內)仍然按標準的升序排序
在多個列上降序排序:如果想在多個列上進行降序排序, 必須對每個列指定DESC關鍵字
區分大小寫和排序順序:在對文本性的數據進行排序時, A與a相同嗎? a位於B之前還是位於Z之後?這些問題不是理論問題,其答案取決於數據庫如何設置。
使用ORDER BY
和LIMIT
的組合,能夠找出一個列中最高或最低的值。下面的例子演示如何找出最昂貴物品的值:
mysql> SELECT prod_price FROM products ORDER BY prod_price DESC LIMIT 1;
+------------+
| prod_price |
+------------+
| 55.00 |
+------------+
- 分析:
prod_price DESC
保證行是按照由最昂貴到最便宜檢索的,而LIMIT 1
告訴MySQL僅返回一行。
ORDER BY子句的位置:在給出
ORDER BY
子句時,應該保證它位於FROM
子句之後。如果使用LIMIT
,它必須位於ORDER BY
之後。使用子句的次序不對將產生錯誤消息。