前言

这一节将讲述如何使用SELECTORDER BY字句,根据需要排序检索出来的数据

首先,从上次的例子开始

1
2
SELECT prod_name
FROM Products;

正如上篇所说,返回的数据没有特定的数据,但其实也不是随机显示的。如果不排序,数据一般将以它在表中出现的顺序显示,这有可能是数据最初添加到表中的顺序。但是如果数据随后进行过更新或删除,那么这个顺序会受到DBMS重用回收存储空间的方式的影响

而关系数据库设计理论认为,如果不明确规定排序顺序,则不应该假定检索出的数据的顺序有任何意义

排序数据

使用ORDER BY以排序数据

1
2
3
SELECT prod_name
FROM Products
ORDER BY prod_name;

警告:ORDER BY 子句的位置

请保证ORDER BY子句位于SELECT语句的最后一句,否则将会出错

提示:使用其他列进行排序

通常,ORDER BY子句中使用的列将是为显示而选择的列。但是,实际上并不一定要这样,用非检索的列排序数据是完全合法的

按多个列排序

经常需要按不止一个列进行排序,例如要显示雇员的名单,可以希望先按照姓排序,再按照名排序

要实现这一目的,只需使用逗号分开各个列名

下面的代码检索3个列,按其中的两个列进行排序 —— 先按价格,再按名称

1
2
3
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price, prod_name;

按位置排列

除了指定列名之外,提供在语句中的相对列位置也可以指定排序列

1
2
3
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY 2,3;

可以看出,这里的输出和上面的完全相同

  • ORDER BY 2 表示按第2个检索列(prod_price)排序

  • ORDER BY 2,3 表示先按第2个列(prod_price)排序,然后再按第3个列(prod_name)排序

这一技巧的好处在于不需要重新输入列名,但它也有缺点 。首先,不明确给出列名可能根据错误的列排序(特别是更改了SELECT名单时,忘记更改ORDER BY子句),其次,如果需要排序的列不在SELECT名单中,则显然不能使用这一技巧

提示:混合使用两种方法

如果有必要,可以选择混合使用实际列名和相对列位置

指定排序方向

默认的排序方向是递增(从小到大),当然,你也可以指定为递减,只需加上DESC关键字

例如下面将最贵的商品排在前面

1
2
3
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price DESC;

如果打算使用多个列排序,该怎么办?下面的例子以降序排序商品,再加上产品名

1
2
3
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price DESC, prod_name;

DESC关键字只应用到单个列上,所以你可以发现价格是单调递减的,而在同一价格中,名称是严格递增的

警告:在多个列上降序排序

如果你想在多个列上进行降序排序,必须在每一列使用DESC关键字

实际上,DESCDESCENDING的缩写,这两个关键字都可以使用,对应的还有ASCASCENDING(递增),不过显然没什么用,毕竟默认就是递增的