3-4对查询结果进行排序

SQL
Author

Rui

Published

November 12, 2022

3-4 对查询结果进行排序

ORDER BY 子句

使用 ORDER BY 子句来明确指定排序顺序:

SELECT <列名1>, ...
  FROM <表名>
 ORDER BY <排序基准列1>, ...;

ORDER BY 子句中的列名称为排序键

按照售价由低到高(升序)进行排列:

SELECT product_id, product_name, sale_price, purchase_price
  FROM Product
 ORDER BY sale_price;
8 records
product_id product_name sale_price purchase_price
0008 圆珠笔 100 NA
0006 叉子 500 NA
0002 打孔器 500 320
0007 擦菜板 880 790
0001 T恤衫 1000 500
0004 菜刀 3000 2800
0003 运动T恤 4000 2800
0005 高压锅 6800 5000
Note

书写顺序:

SELECT -> FROM -> WHERE -> GROUP BY -> HAVING -> ORDER BY

ORDER BY 子句必须在 SELECT 语句的末尾,因为对数据的排序必须在结果即将返回的时候执行

指定升序或降序

关键词:ASC(升序)、DESC(降序)

关键词必须位于列名之后。

SELECT product_id, product_name, sale_price, purchase_price
  FROM Product
 ORDER BY sale_price DESC;
8 records
product_id product_name sale_price purchase_price
0005 高压锅 6800 5000
0003 运动T恤 4000 2800
0004 菜刀 3000 2800
0001 T恤衫 1000 500
0007 擦菜板 880 790
0002 打孔器 500 320
0006 叉子 500 NA
0008 圆珠笔 100 NA
Tip

ASC 和 DESC 都是以列为单位指定的,因此可以同时指定一个列为升序,指定其他列为降序。

指定多个排序键

SELECT product_id, product_name, sale_price, purchase_price
  FROM Product
 ORDER BY sale_price, product_id;
8 records
product_id product_name sale_price purchase_price
0008 圆珠笔 100 NA
0002 打孔器 500 320
0006 叉子 500 NA
0007 擦菜板 880 790
0001 T恤衫 1000 500
0004 菜刀 3000 2800
0003 运动T恤 4000 2800
0005 高压锅 6800 5000

对于售价相同的商品,会按照商品名称再次排序。

NULL 的顺序

purchase_price 一列中有 NULL,这时会如何排序呢?

由于不能对 NULL 使用比较运算符,所以 NULL 无法进行排序。当使用含有 NULL 的列作为排序键时,NULL 会在结果的开头或末尾汇总显示。

SELECT product_id, product_name, sale_price, purchase_price
  FROM Product
 ORDER BY purchase_price;
8 records
product_id product_name sale_price purchase_price
0002 打孔器 500 320
0001 T恤衫 1000 500
0007 擦菜板 880 790
0003 运动T恤 4000 2800
0004 菜刀 3000 2800
0005 高压锅 6800 5000
0006 叉子 500 NA
0008 圆珠笔 100 NA

在排序键中使用列别名

SELECT product_id AS id, product_name, sale_price AS sp, purchase_price
  FROM Product
 ORDER BY sp, id
8 records
id product_name sp purchase_price
0008 圆珠笔 100 NA
0002 打孔器 500 320
0006 叉子 500 NA
0007 擦菜板 880 790
0001 T恤衫 1000 500
0004 菜刀 3000 2800
0003 运动T恤 4000 2800
0005 高压锅 6800 5000

上一节说到 HAVING 子句不可以使用列别名,但在 ORDER BY 子句中却是可以使用列的别名的。 这是因为 SELECT 子句的执行先于 ORDER BY ,在 SELECT 中定义的列的别名自然可以在之后的 ORDER BY 中使用。

Note

执行顺序:

FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY

ORDER BY 中可以使用的列

把之前学过的子句汇总一下:

  • 包含聚合函数时 SELECT 可以使用的列:常数聚合函数聚合键

  • HAVING 可以使用的列:常数聚合函数聚合键

  • ORDER BY 可以使用的列:SELECT中包含的列SELECT中没包含的列聚合函数

SELECT product_type, COUNT(*)
  FROM Product
 GROUP BY product_type
 ORDER BY COUNT(*)
3 records
product_type count
衣服 2
办公用品 2
厨房用具 4

不要使用列编号

虽然 ORDER BY 中可以使用列编号来代替列名,但不推荐。原因:

  • 阅读较为困难

  • 未来版本可能会移除