本章讲select语句的order by 字句
5.1
检索出的数据并不是以纯粹的随机显示的,如果不排序,数据将以它在底层出现的顺序排序。如果数据后面进行过更新或者删除,可能会受到MySql重用回收存储空间的影响。关系型数据库设计理论任务,如果不明确规定排序,则不应该假定检索出的数据的顺序有意义
5.2子句
-
SQL语句由子句构成,有的是必须的有的是可选的。一个句子通常由一个关键字和所提供的数据组成。子句例子有SELECT语句的FROM子句
-
为了明确地排序用SELECT语句检索出的数据,可使用ORDER BY子句。
- 可使用ORDER BY子句取一个或者多个列的名字,据此对输出进行排序
输入:
select bookid
from BookInfo;
输出:
+-----------+
| bookid |
+-----------+
| 7800-7336 |
| 7564-1018 |
| 7800-8287 |
| 9787-5057 |
| 9787-5378 |
| 9787-5613 |
| 9787-8020 |
| 1008-2352 |
| 7111-1790 |
| 7305-0458 |
+-----------+
10 rows in set (0.00 sec)
输入:
select bookid
from BookInfo
order by bookid;
输出:
+-----------+
| bookid |
+-----------+
| 1008-2352 |
| 7111-1790 |
| 7305-0458 |
| 7564-1018 |
| 7800-7336 |
| 7800-8287 |
| 9787-5057 |
| 9787-5378 |
| 9787-5613 |
| 9787-8020 |
+-----------+
10 rows in set (0.00 sec)
这条语句除了指示MySql对bookid列以顺序排序数据的order by子句外,与前面的语句相同
通常,使用order by子句中使用的列将是为显示所选择的列,但是并非一定需要这样。
5.3按多个列进行排序
为了按多个列排序,只需要指定列名,列名直接使用逗号分开即可
下面的语句先按书名排序 再按作者排序
输入
select bookid,bookname,author
from BookInfo
order by bookname,author;
输出
+-----------+-----------------------+------------------+
| bookid | bookname | author |
+-----------+-----------------------+------------------+
| 7111-1790 | Java2核心技术 | Gray Comel |
| 7800-8287 | 倾城之恋 | 莫然 |
| 7564-1018 | 大学语文教程 | 董自厚 |
| 9787-5613 | 沉睡之城111 | 蔡骏 |
| 9787-8020 | 爱丽丝漫游奇境 | 卡罗尔 |
| 1008-2352 | 电脑乐园 | 谭宇 |
| 9787-5057 | 盗墓笔记 | 南派三叔 |
| 7305-0458 | 计算机应用基础 | 黄强 |
| 7800-7336 | 谁动了我的奶酪 | 斯宾塞.约翰 |
| 9787-5378 | 韩寒作品集 | 韩寒 |
+-----------+-----------------------+------------------+
10 rows in set (0.00 sec)
多个排序时,完全安装规定的顺序进行排序,对于上面的例子输出中,如果bookname列有相同的,则按author对相同的bookname进行排序。
5.3指定排序方向
降序
通过降序排序,必须指定DESC关键字
格式
select 列名
from 表名
order by 列名 DESC;
下面例子按照价格降序
select *
from products
order by prod_price desc;
如果使用降序的时候打算用多个列排序则使用逗号分割开(最贵的在前面)
select *
from products
order by prod_price desc,prod_name;
分析:DESC
关键字只应用到直接位于其前面的列名,因此上列中不会对prod_name进行降序排序
注意:如果你想要也prod_name也同时进行降序则必须参考如下
select *
from products
order by prod_price desc,prod_name desc;
分析:对每个列都指定DESC关键字
升序
与desc关键字想反的是ASC,在升序排序的时候指定,默认是升序的格式与使用desc一致
order by+limit
使用order by+和limit组合,找出一个列中最高或者最低的值:
select *
from products
order by prod_price desc
limit 1;
order by子句的位置
在给出order by 子句时,应该保证位于from子句后,如果使用limit,必须位于order bv之后。