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之後, 使用子句的次序不對將產生錯誤的訊息