2019-08-04
一条普通的SQL
查询语句返回数据库表中的输出,并没有特定的顺序。
其实,检索出的数据并不是以纯粹的随机顺序显示的。如果不排序,数据一般讲以它在底层中出现的顺序显示。这可以是数据最初添加到表中的顺序。但是,如果数据后来进行过更新或删除,则此顺序将会受到
MySQL
重用回收存储空间的影响。因此,如果不明确控制的话,不能(也不应该)依赖该排序顺序。关系数据库设计理论认为,如果不明确规定排序顺序,则不应该嘉定检索出的数据的顺序有意义。
ORDER BY子句(clause)
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) |
+----------------+
14 rows in set (0.07 sec)
这条语句指示MySQL
对prod_name
列以字母顺序排序数据。
通过非选择列进行排序 通常,
ORDER BY
子句中使用的列将是为显示所选择的列。但是,实际上并不一定要这样,用非检索的列排序数据是完全合法的。
按多个列排序
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 |
+---------+------------+----------------+
14 rows in set (0.00 sec)
在按多个列排序时,排序完全按所规定的顺序进行。换句话说,对于上述例子中的输出,仅在多个行具有相同的
prod_price
值时才对产品按prod_name
进行排序。如果prod_price
列中所有的值都是唯一的,则不会按照prod_name
排序。
指定排序方向(默认升序)
数据排序不限于升序排序(从A到Z)。这只是默认的排序顺序,还可以使用
ORDER BY
子句以降序(从Z到A)顺序排序。为了进行降序排序,必须指定DESC
关键字。与DESC
相反的关键字是ASC
,在升序排序时可以指定它。实际上,ASC
没有多大用处,因为升序是默认的。
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) |
+---------+------------+----------------+
14 rows in set (0.00 sec)
DESC
关键字只应用到直接位于其前面的列名。在上例中,只对prod_price
列指定DESC
,对prod_name
列不指定。因此,prod_price
列以降序排序,而prod_name
列(在每个价格内)仍然按标准的升序排序。
如果想在多个列上进行降序排序,必须对每个列指定DESC
关键字。如下所示:
mysql> SELECT prod_id, prod_price, prod_name
-> FROM products
-> ORDER BY prod_price DESC, prod_name 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 |
| TNT1 | 2.50 | TNT (1 stick) |
| FC | 2.50 | Carrots |
+---------+------------+----------------+
14 rows in set (0.00 sec)
在
MySQL
中按字典顺序排序中,A
被视为与a
相同,这是MySQL
默认行为。
ORDER BY
子句的位置
在给出
ORDER BY
子句时,应该保证它位于FROM
子句之后。如果使用LIMIT
,它必须位于ORDER BY
之后。使用子句的次序不对将产生错误消息。