数据库系统原理与应用教程(043)—— MySQL 查询(五):对查询结果排序


目录

  • 数据库系统原理与应用教程(043)—— MySQL 查询(五):对查询结果排序
  • 一、使用列名排序
  • 二、使用表达式排序
  • 三、使用数字代替列名或表达式


在查询中使用 ORDER BY 子句可以对查询结果进行排序。默认按照升序对记录进行排序,如果希望按照降序对记录进行排序,可以使用 DESC 关键字。

语法格式如下:

-- 其中【列名或表达式】可以使用序号来代替
ORDER BY
列名或表达式 [DESC] [,...]

一、使用列名排序

例如:

(1)查询学生表的信息,按照 birth 升序排列。

mysql> select * from student order by birth;
+-------+-----------+---------------------+-------------+-----------+
| s_id  | s_name    | birth               | phone       | addr      |
+-------+-----------+---------------------+-------------+-----------+
| S2013 | 曹梦德    | 1998-02-13 00:00:00 | 13853735522 | 郑州市    |
| S2014 | 刘艳      | 1998-06-24 00:00:00 | 13623735335 | 郑州市    |
| S2026 | 张学有    | 1998-07-06 00:00:00 | 13743735566 | 郑州市    |
| S2022 | 周华建    | 1999-05-25 00:00:00 | 13243735578 | 郑州市    |
| S2023 | 特朗普    | 1999-06-21 00:00:00 | 13343735588 | 新乡市    |
| S2015 | 刘岩      | 1999-07-06 00:00:00 | 13813735225 | 信阳市    |
| S2012 | 刘小青    | 1999-10-11 00:00:00 | 13603732255 | 新乡市    |
| S2031 | 李明博    | 1999-10-26 00:00:00 | 13643732222 | 郑州市    |
| S2011 | 张晓刚    | 1999-12-03 00:00:00 | 13163735775 | 信阳市    |
| S2032 | 达芬奇    | 1999-12-31 00:00:00 | 13043731234 | 郑州市    |
| S2021 | 董雯花    | 2000-07-30 00:00:00 | 13533735564 | 开封市    |
| S2025 | 周健华    | 2000-08-22 00:00:00 | 13788736655 | 开封市    |
| S2016 | 刘若非    | 2000-08-31 00:00:00 | 13683735533 | 开封市    |
| S2024 | 奥巴马    | 2000-10-17 00:00:00 | 13843735885 | 信阳市    |
+-------+-----------+---------------------+-------------+-----------+
14 rows in set (0.01 sec)

(2)查询学生表的信息,按照 phone 降序排列。

mysql> select * from student order by phone desc;
+-------+-----------+---------------------+-------------+-----------+
| s_id  | s_name    | birth               | phone       | addr      |
+-------+-----------+---------------------+-------------+-----------+
| S2013 | 曹梦德    | 1998-02-13 00:00:00 | 13853735522 | 郑州市    |
| S2024 | 奥巴马    | 2000-10-17 00:00:00 | 13843735885 | 信阳市    |
| S2015 | 刘岩      | 1999-07-06 00:00:00 | 13813735225 | 信阳市    |
| S2025 | 周健华    | 2000-08-22 00:00:00 | 13788736655 | 开封市    |
| S2026 | 张学有    | 1998-07-06 00:00:00 | 13743735566 | 郑州市    |
| S2016 | 刘若非    | 2000-08-31 00:00:00 | 13683735533 | 开封市    |
| S2031 | 李明博    | 1999-10-26 00:00:00 | 13643732222 | 郑州市    |
| S2014 | 刘艳      | 1998-06-24 00:00:00 | 13623735335 | 郑州市    |
| S2012 | 刘小青    | 1999-10-11 00:00:00 | 13603732255 | 新乡市    |
| S2021 | 董雯花    | 2000-07-30 00:00:00 | 13533735564 | 开封市    |
| S2023 | 特朗普    | 1999-06-21 00:00:00 | 13343735588 | 新乡市    |
| S2022 | 周华建    | 1999-05-25 00:00:00 | 13243735578 | 郑州市    |
| S2011 | 张晓刚    | 1999-12-03 00:00:00 | 13163735775 | 信阳市    |
| S2032 | 达芬奇    | 1999-12-31 00:00:00 | 13043731234 | 郑州市    |
+-------+-----------+---------------------+-------------+-----------+
14 rows in set (0.00 sec)

(3)查询学生表的信息,同时按照 addr 升序、phone 降序排列。

mysql> select * from student order by addr, phone desc;
+-------+-----------+---------------------+-------------+-----------+
| s_id  | s_name    | birth               | phone       | addr      |
+-------+-----------+---------------------+-------------+-----------+
| S2024 | 奥巴马    | 2000-10-17 00:00:00 | 13843735885 | 信阳市    |
| S2015 | 刘岩      | 1999-07-06 00:00:00 | 13813735225 | 信阳市    |
| S2011 | 张晓刚    | 1999-12-03 00:00:00 | 13163735775 | 信阳市    |
| S2025 | 周健华    | 2000-08-22 00:00:00 | 13788736655 | 开封市    |
| S2016 | 刘若非    | 2000-08-31 00:00:00 | 13683735533 | 开封市    |
| S2021 | 董雯花    | 2000-07-30 00:00:00 | 13533735564 | 开封市    |
| S2012 | 刘小青    | 1999-10-11 00:00:00 | 13603732255 | 新乡市    |
| S2023 | 特朗普    | 1999-06-21 00:00:00 | 13343735588 | 新乡市    |
| S2013 | 曹梦德    | 1998-02-13 00:00:00 | 13853735522 | 郑州市    |
| S2026 | 张学有    | 1998-07-06 00:00:00 | 13743735566 | 郑州市    |
| S2031 | 李明博    | 1999-10-26 00:00:00 | 13643732222 | 郑州市    |
| S2014 | 刘艳      | 1998-06-24 00:00:00 | 13623735335 | 郑州市    |
| S2022 | 周华建    | 1999-05-25 00:00:00 | 13243735578 | 郑州市    |
| S2032 | 达芬奇    | 1999-12-31 00:00:00 | 13043731234 | 郑州市    |
+-------+-----------+---------------------+-------------+-----------+
14 rows in set (0.00 sec)

(4)查询学生表的信息,同时按照 addr 降序和 phone 降序排列。

mysql> select * from student order by addr desc, phone desc;
+-------+-----------+---------------------+-------------+-----------+
| s_id  | s_name    | birth               | phone       | addr      |
+-------+-----------+---------------------+-------------+-----------+
| S2013 | 曹梦德    | 1998-02-13 00:00:00 | 13853735522 | 郑州市    |
| S2026 | 张学有    | 1998-07-06 00:00:00 | 13743735566 | 郑州市    |
| S2031 | 李明博    | 1999-10-26 00:00:00 | 13643732222 | 郑州市    |
| S2014 | 刘艳      | 1998-06-24 00:00:00 | 13623735335 | 郑州市    |
| S2022 | 周华建    | 1999-05-25 00:00:00 | 13243735578 | 郑州市    |
| S2032 | 达芬奇    | 1999-12-31 00:00:00 | 13043731234 | 郑州市    |
| S2012 | 刘小青    | 1999-10-11 00:00:00 | 13603732255 | 新乡市    |
| S2023 | 特朗普    | 1999-06-21 00:00:00 | 13343735588 | 新乡市    |
| S2025 | 周健华    | 2000-08-22 00:00:00 | 13788736655 | 开封市    |
| S2016 | 刘若非    | 2000-08-31 00:00:00 | 13683735533 | 开封市    |
| S2021 | 董雯花    | 2000-07-30 00:00:00 | 13533735564 | 开封市    |
| S2024 | 奥巴马    | 2000-10-17 00:00:00 | 13843735885 | 信阳市    |
| S2015 | 刘岩      | 1999-07-06 00:00:00 | 13813735225 | 信阳市    |
| S2011 | 张晓刚    | 1999-12-03 00:00:00 | 13163735775 | 信阳市    |
+-------+-----------+---------------------+-------------+-----------+
14 rows in set (0.00 sec)

二、使用表达式排序

例如:

(1)查询学生表的信息,按照 age(由 birth 通过计算得到) 升序排列。

mysql> select * from student order by year(now())-year(birth);
+-------+-----------+---------------------+-------------+-----------+
| s_id  | s_name    | birth               | phone       | addr      |
+-------+-----------+---------------------+-------------+-----------+
| S2016 | 刘若非    | 2000-08-31 00:00:00 | 13683735533 | 开封市    |
| S2021 | 董雯花    | 2000-07-30 00:00:00 | 13533735564 | 开封市    |
| S2024 | 奥巴马    | 2000-10-17 00:00:00 | 13843735885 | 信阳市    |
| S2025 | 周健华    | 2000-08-22 00:00:00 | 13788736655 | 开封市    |
| S2011 | 张晓刚    | 1999-12-03 00:00:00 | 13163735775 | 信阳市    |
| S2012 | 刘小青    | 1999-10-11 00:00:00 | 13603732255 | 新乡市    |
| S2015 | 刘岩      | 1999-07-06 00:00:00 | 13813735225 | 信阳市    |
| S2022 | 周华建    | 1999-05-25 00:00:00 | 13243735578 | 郑州市    |
| S2023 | 特朗普    | 1999-06-21 00:00:00 | 13343735588 | 新乡市    |
| S2031 | 李明博    | 1999-10-26 00:00:00 | 13643732222 | 郑州市    |
| S2032 | 达芬奇    | 1999-12-31 00:00:00 | 13043731234 | 郑州市    |
| S2013 | 曹梦德    | 1998-02-13 00:00:00 | 13853735522 | 郑州市    |
| S2014 | 刘艳      | 1998-06-24 00:00:00 | 13623735335 | 郑州市    |
| S2026 | 张学有    | 1998-07-06 00:00:00 | 13743735566 | 郑州市    |
+-------+-----------+---------------------+-------------+-----------+
14 rows in set (0.00 sec)

(2)查询学生表的信息,按照 phone 的后 4 位降序排列。

mysql> select * from student order by right(phone,4) desc;
+-------+-----------+---------------------+-------------+-----------+
| s_id  | s_name    | birth               | phone       | addr      |
+-------+-----------+---------------------+-------------+-----------+
| S2025 | 周健华    | 2000-08-22 00:00:00 | 13788736655 | 开封市    |
| S2024 | 奥巴马    | 2000-10-17 00:00:00 | 13843735885 | 信阳市    |
| S2011 | 张晓刚    | 1999-12-03 00:00:00 | 13163735775 | 信阳市    |
| S2023 | 特朗普    | 1999-06-21 00:00:00 | 13343735588 | 新乡市    |
| S2022 | 周华建    | 1999-05-25 00:00:00 | 13243735578 | 郑州市    |
| S2026 | 张学有    | 1998-07-06 00:00:00 | 13743735566 | 郑州市    |
| S2021 | 董雯花    | 2000-07-30 00:00:00 | 13533735564 | 开封市    |
| S2016 | 刘若非    | 2000-08-31 00:00:00 | 13683735533 | 开封市    |
| S2013 | 曹梦德    | 1998-02-13 00:00:00 | 13853735522 | 郑州市    |
| S2014 | 刘艳      | 1998-06-24 00:00:00 | 13623735335 | 郑州市    |
| S2015 | 刘岩      | 1999-07-06 00:00:00 | 13813735225 | 信阳市    |
| S2012 | 刘小青    | 1999-10-11 00:00:00 | 13603732255 | 新乡市    |
| S2031 | 李明博    | 1999-10-26 00:00:00 | 13643732222 | 郑州市    |
| S2032 | 达芬奇    | 1999-12-31 00:00:00 | 13043731234 | 郑州市    |
+-------+-----------+---------------------+-------------+-----------+
14 rows in set (0.01 sec)

三、使用数字代替列名或表达式

在 ORDER BY 子句中可以使用数字代替列名或表达式,数字 n 的含义是指列名或表达式在 SELECT 子句中的序号。数字序号所代表的列或表达式必须出现在 SELECT 子句中。

例如:

(1)查询学生信息,按照 age 降序排列。

-- order by 后面的 3 就是指按照 select 列表中的第 3 个选项排序
mysql> select s_id, s_name, year(now()) - year(birth) age
    -> from student order by 3;
+-------+-----------+------+
| s_id  | s_name    | age  |
+-------+-----------+------+
| S2016 | 刘若非    |   22 |
| S2021 | 董雯花    |   22 |
| S2024 | 奥巴马    |   22 |
| S2025 | 周健华    |   22 |
| S2011 | 张晓刚    |   23 |
| S2012 | 刘小青    |   23 |
| S2015 | 刘岩      |   23 |
| S2022 | 周华建    |   23 |
| S2023 | 特朗普    |   23 |
| S2031 | 李明博    |   23 |
| S2032 | 达芬奇    |   23 |
| S2013 | 曹梦德    |   24 |
| S2014 | 刘艳      |   24 |
| S2026 | 张学有    |   24 |
+-------+-----------+------+
14 rows in set (0.00 sec)

(2)查询学生信息,按照 addr 降序和 phone 后 4 位降序排列。

-- order by 后面的 4 表示 select 子句中的第四项(addr),3 表示 select 子句中的第 3 项(表达式)
mysql> select s_id, s_name, right(phone,4) phone4, addr
    -> from student order by 4 desc, 3 desc;
+-------+-----------+--------+-----------+
| s_id  | s_name    | phone4 | addr      |
+-------+-----------+--------+-----------+
| S2022 | 周华建    | 5578   | 郑州市    |
| S2026 | 张学有    | 5566   | 郑州市    |
| S2013 | 曹梦德    | 5522   | 郑州市    |
| S2014 | 刘艳      | 5335   | 郑州市    |
| S2031 | 李明博    | 2222   | 郑州市    |
| S2032 | 达芬奇    | 1234   | 郑州市    |
| S2023 | 特朗普    | 5588   | 新乡市    |
| S2012 | 刘小青    | 2255   | 新乡市    |
| S2025 | 周健华    | 6655   | 开封市    |
| S2021 | 董雯花    | 5564   | 开封市    |
| S2016 | 刘若非    | 5533   | 开封市    |
| S2024 | 奥巴马    | 5885   | 信阳市    |
| S2011 | 张晓刚    | 5775   | 信阳市    |
| S2015 | 刘岩      | 5225   | 信阳市    |
+-------+-----------+--------+-----------+
14 rows in set (0.00 sec)