_3_ SQL 排序数据(ORDER BY)
本文DEMO
https://gitee.com/changsanjiang/SQLDemo/tree/master
排序数据
正如前面我们使用的SQL语句, 下面的输入返回某个表的单个列. 但请看输出, 并没有特定的顺序.
SELECT prod_name
FROM Products;
image.png
其实, 检索出的数据并不是随机显示的. 如果不排序, 数据一般将以它在底层表中出现的顺序显示, 这有可能是数据最初添加到表中的顺序. 但是如果数据随后进行过更新或删除, 那么这个顺序将会受到DBMS重用回收存储空间的方式的影响. 因此, 如果不明确控制的话, 则最终的结果不能(也不应该)依赖该排序顺序.
关系数据库设计理论认为, 如果不明确规定排序顺序, 则不应该假定检索出来的数据, 它的顺序有什么意义.
**子句**
SQL语句由子句构成. 有些子句是必须的, 有些则是可选的.
一个子句通常由一个关键字加上所提供的数据组成. 例如 FROM Products.
为了明确地排序用 SELECT 语句检索出的数据, 可使用 ORDER BY 子句. ORDER BY 子句取一个或多个列的名字, 据此对输出进行排序. 请看如下例子:
SELECT prod_name
FROM Products
ORDER BY prod_name;
分析:
这条语句, 其中除了指示DBMS对prod_name列以字母顺序排序数据外(ORDER BY prod_name), 剩余与前面学过的相同.
输出:
image.png**注意: ORDER BY 子句的位置**
在指定一条 ORDER BY 子句时, 应该保证它是 SELECT 语句中最后一条子句. 如果它不是最后的子句, 将会出现错误消息.
提示: 通过非选择列进行排序
实际上, 也可以使用非选择的列进行排序, 这也是合法的.
按多个列排序
要按多个列排序, 简单指定列名, 列名之间用逗号分开即可( 就像选择多个列时那样 ).
如下, 检索3个列, 并按其中两个列对结果进行排序 -- 首先按价格, 然后按名称排序
输入:
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY 2, 3;
输出:
image.png分析:
可以看到, 这里与上面不同之处在于 ORDER BY 子句. ORDER BY 2 表示按 SELECT 清单中的第二个列 prod_price 进行排序. ORDER BY 2, 3 表示先按照 prod_price, 在按 prod_name 进行排序.
这一技术的好处在于不用重新输入列名. 但它也有缺点. 首先, 不明确给出列名有可能错用列名. 其次, 在对 SELECT 清单进行更改时容易错误地对数据进行排序.
指定排序方向
数据的排序不局限于升序排序( 从A到Z ), 这只是默认的排序顺序. 还可以使用 ORDER BY 子句进行降序排序( 从Z到A )排序. 为了进行降序排序, 必须指定 DESC 关键字.
输入:
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price DESC;
输出:
image.png多个列上降序排序:
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_id DESC, prod_price DESC;
输出:
image.png**提示: 区分大小写和排序顺序**
在对文本性数据进行排序时, A 与 a 相同吗? a 位于 B 之前, 还是 Z 之后?
这些问题不是理论问题, 其答案取决于数据库的设置方式.