首页 > 编程笔记 > MySQL笔记 阅读:3

MySQL ORDER BY子句的用法(非常详细)

从前面的查询结果中可以发现,有些字段的值是没有任何顺序的,MySQL 可以通过在 SELECT 语句中使用 ORDER BY 子句对查询的结果进行排序。

为了方便演示 ORDER BY 的用法,需要往数据表插入如下数据:
mysql> INSERT INTO fruits (f_id, s_id, f_name, f_price)
       VALUES('a1', 101,'apple',5.2),
       ('b1',101,'blackberry', 10.2),
       ('bs1',102,'orange', 11.2),
       ('bs2',105,'melon',8.2),
       ('t1',102,'banana', 10.3),
       ('t2',102,'grape', 5.3),
       ('o2',103,'coconut', 9.2),
       ('c0',101,'cherry', 3.2),
       ('a2',103, 'apricot',2.2),
       ('l2',104,'lemon', 6.4),
       ('b2',104,'berry', 7.6),
       ('m1',106,'mango', 15.7),
       ('m2',105,'xbabay', 2.6),
       ('t4',107,'xbababa', 3.6),
       ('m3',105,'xxtt', 11.6),
       ('b5',107,'xxxx', 3.6);

MySQL ORDER BY单列排序

例如,查询 f_name 字段,查询结果如下:
mysql> SELECT f_name FROM fruits;
+------------+
| f_name     |
+------------+
| apple      |
| apricot    |
| blackberry |
| berry      |
| xxxx       |
| orange     |
| melon      |
| cherry     |
| lemon      |
| mango      |
| xbabay     |
| xxtt       |
| coconut    |
| banana     |
| grape      |
| xbababa    |
+------------+
可以看到,查询的数据并没有以一种特定的顺序显示。如果没有对查询结果进行排序,就将根据它们插入数据表中的顺序来显示。

下面使用 ORDER BY 子句对指定的列数据进行排序。

【实例 1】查询表 fruits 中的 f_name 字段,并对其进行排序,SQL 语句如下:
mysql> SELECT f_name FROM fruits ORDER BY f_name;
+------------+
| f_name     |
+------------+
| apple      |
| apricot    |
| banana     |
| berry      |
| blackberry |
| cherry     |
| coconut    |
| grape      |
| lemon      |
| mango      |
| melon      |
| orange     |
| xbababa    |
| xbabay     |
| xxtt       |
| xxxx       |
+------------+
该语句查询的结果和前面的相同,不同的是,通过指定 ORDER BY 子句,MySQL 对 name 列的数据按字母表的顺序进行了升序排列。

MySQL ORDER BY多列排序

有时,需要根据多列值进行排序。比如,如果要显示一个学生列表,可能会有多个学生的姓氏是相同的,因此还需要根据学生的名进行排序。

对多列数据进行排序时,要将需要排序的列用逗号隔开。

【实例 2】查询表 fruits 中的 f_name 和 f_price 字段,先按 f_name 排序,再按 f_price 排序,SQL 语句如下:
SELECT f_name, f_price FROM fruits ORDER BY f_name, f_price;
查询结果如下:
+------------+---------+
| f_name     | f_price |
+------------+---------+
| apple      | 5.20    |
| apricot    | 2.20    |
| banana     | 10.30   |
| berry      | 7.60    |
| blackberry | 10.20   |
| cherry     | 3.20    |
| coconut    | 9.20    |
| grape      | 5.30    |
| lemon      | 6.40    |
| mango      | 15.70   |
| melon      | 8.20    |
| orange     | 11.20   |
| xibababa   | 3.60    |
| xbabay     | 2.60    |
| xxtt       | 11.60   |
| xxxxx      | 3.60    |
+------------+---------+
在对多列进行排序的时候,排序的第一列必须有相同的列值,才会对第二列进行排序。如果第一列数据中所有值都是唯一的,将不再对第二列进行排序。

MySQL ORDER BY指定排序方向

默认情况下,查询数据按字母升序进行排序(A~Z),但数据的排序并不仅限于此,还可以使用 ORDER BY 对查询结果进行降序排序(Z~A)。这可以通过关键字 DESC 实现。

【实例 3】查询表 fruits 中的 f_name 和 f_price 字段,对结果按 f_price 降序排序,SQL 语句如下:
SELECT f_name, f_price FROM fruits ORDER BY f_price DESC;
查询结果如下:
+------------+---------+
| f_name     | f_price |
+------------+---------+
| mango      | 15.70   |
| xxtt       | 11.60   |
| orange     | 11.20   |
| banana     | 10.30   |
| blackberry | 10.20   |
| coconut    | 9.20    |
| melon      | 8.20    |
| berry      | 7.60    |
| lemon      | 6.40    |
| grape      | 5.30    |
| apple      | 5.20    |
| xxxxx      | 3.60    |
| xibababa   | 3.60    |
| cherry     | 3.20    |
| xbabay     | 2.60    |
| apricot    | 2.20    |
+------------+---------+
与 DESC 相反的是 ASC(升序),它将字段列中的数据按字母表顺序升序排列。实际上,在排序的时候 ASC 是默认的排序方式,所以加不加 ASC 关键字都可以。

也可以对多列进行不同的顺序排序,如下面的实例所示。

【实例 4】查询表 fruits,先按 f_price 降序排列,再按 f_name 升序排列,SQL 语句如下:
SELECT f_price, f_name FROM fruits ORDER BY f_price DESC, f_name;
查询结果如下:
+---------+------------+
| f_price | f_name     |
+---------+------------+
| 15.70   | mango      |
| 11.60   | xxtt       |
| 11.20   | orange     |
| 10.30   | banana     |
| 10.20   | blackberry |
| 9.20    | coconut    |
| 8.20    | melon      |
| 7.60    | berry      |
| 6.40    | lemon      |
| 5.30    | grape      |
| 5.20    | apple      |
| 3.60    | xbababa    |
| 3.60    | xxxxx      |
| 3.20    | cherry     |
| 2.60    | xbabay     |
| 2.20    | apricot    |
+---------+------------+
DESC 关键字只对其前面的列进行降序排列,在这里只对 f_price 排序,而并没有对 f_name 进行排序。因此,f_price 按降序排列,而 f_name 仍按升序排列。如果要对多列都进行降序排列,则必须在每一列的列名后面加 DESC 关键字。

相关文章