1. 程式人生 > 實用技巧 >MySQL基礎之MySQL必知必會(五)排序檢索資料

MySQL基礎之MySQL必知必會(五)排序檢索資料

排序資料

使用SELECT檢索出來的順序並不是以純粹的隨機順序顯示的, 如果不排序, 資料一般將以它在底層表中出現的順序顯示。這可以是資料最初新增到表的順序。但是, 如果資料後來進行過更新和刪除, 則此順序將會受到MySQL重用回收儲存空間的影響。因此, 如果不明確控制的話, 不能依賴該排序順序。

關係資料庫設計理論認為, 如果不明確規定排序的順序, 則不應該假定檢索出的資料的順序有意義。

子句:

  SQL語句由子句構成, 有些子句是必須的, 而有的是可選的。一個子句通常由一個關鍵字和所提供的資料組成。

為了明確地排序SELECT語句檢索出的資料, 可使用ORDER BY子句。ORDER BY子句取一個或多個列的名字, 據此對輸出進行排序。

MariaDB [crashcourse]> 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) | +----------------+ 14 rows in set (0.006 sec) MariaDB [crashcourse]>

通過非選擇列進行排序

通常, ORDER BY子句中使用的列將是為顯示所選擇的列。但是, 實際上並不一定要這樣, 用非檢索的列排序是完全合法的

按多個列排序

經常需要不止一個列進行資料排序。為了按多個列排序, 只要指定列名, 列名之間用逗號分開即可。

下面程式碼檢索3個列, 並按其中兩個列對結果進行排序--首先按照價格, 然後再按照名稱排序。

MariaDB [crashcourse]> 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   |
+---------+------------+----------------+
14 rows in set (0.000 sec)

MariaDB [crashcourse]> 

重要的是理解在按多個列排序時, 排序完全按照所規定的順序進行。

換句話說, 對於上述例子中的輸出, 僅在多個行具有相同的prod_price值時才對產品prod_name進行排序。如果prod_price列中所有的值都是唯一的, 那麼不會按照prod_name排序。

指定排序方向

MySQL預設的排序方式為升序排序, 可以使用ORDER BY子句以降序排序。為了進行降序排序, 必須指定DESC關鍵字

MariaDB [crashcourse]> 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      |
| TNT2    |      10.00 | TNT (5 sticks) |
| FB      |      10.00 | Bird seed      |
| 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)  |
+---------+------------+----------------+
14 rows in set (0.003 sec)

MariaDB [crashcourse]> 

如果打算以多個列排序, 比如: 以降序排序產品(最貴的在最前面), 然後再對產品名進行排序

MariaDB [crashcourse]> 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)  |
+---------+------------+----------------+
14 rows in set (0.000 sec)

MariaDB [crashcourse]> 

DESC關鍵字只作用與直接位於其前面的列名。

在多個列上降序排序

如果想在多個列上進行降序排序, 必須對每個列指定DESC關鍵字

與DESC想法的是ASC(ASCENDING), 在升序排序時可以指定它。但是升序排序是預設的排序方式。

使用ORDER BY和LIMIT的組合, 可以找到一個列中最高的或最低的值。

MariaDB [crashcourse]> SELECT prod_price FROM products ORDER BY prod_price DESC LIMIT 1;
+------------+
| prod_price |
+------------+
|      55.00 |
+------------+
1 row in set (0.000 sec)

MariaDB [crashcourse]> 

ORDER BY子句的位置

在給出ORDER BY子句時, 應該保證它位於FROM子句之後。如果使用LIMIT, 它必須位於ORDER BY之後, 使用子句的次序不對將產生錯誤的訊息