SQL 入门笔记(三)排列检索数据
前言
这一节将讲述如何使用SELECT
的ORDER BY
字句,根据需要排序检索出来的数据
首先,从上次的例子开始
1 | SELECT prod_name |
正如上篇所说,返回的数据没有特定的数据,但其实也不是随机显示的。如果不排序,数据一般将以它在表中出现的顺序显示,这有可能是数据最初添加到表中的顺序。但是如果数据随后进行过更新或删除,那么这个顺序会受到DBMS
重用回收存储空间的方式的影响
而关系数据库设计理论认为,如果不明确规定排序顺序,则不应该假定检索出的数据的顺序有任何意义
排序数据
使用ORDER BY
以排序数据
1 | SELECT prod_name |
警告:ORDER BY 子句的位置
请保证ORDER BY
子句位于SELECT
语句的最后一句,否则将会出错
提示:使用其他列进行排序
通常,ORDER BY
子句中使用的列将是为显示而选择的列。但是,实际上并不一定要这样,用非检索的列排序数据是完全合法的
按多个列排序
经常需要按不止一个列进行排序,例如要显示雇员的名单,可以希望先按照姓排序,再按照名排序
要实现这一目的,只需使用逗号分开各个列名
下面的代码检索3个列,按其中的两个列进行排序 —— 先按价格,再按名称
1 | SELECT prod_id, prod_price, prod_name |
按位置排列
除了指定列名之外,提供在语句中的相对列位置也可以指定排序列
1 | SELECT prod_id, prod_price, prod_name |
可以看出,这里的输出和上面的完全相同
-
ORDER BY 2
表示按第2个检索列(prod_price
)排序 -
ORDER BY 2,3
表示先按第2个列(prod_price
)排序,然后再按第3个列(prod_name
)排序
这一技巧的好处在于不需要重新输入列名,但它也有缺点 。首先,不明确给出列名可能根据错误的列排序(特别是更改了SELECT
名单时,忘记更改ORDER BY
子句),其次,如果需要排序的列不在SELECT
名单中,则显然不能使用这一技巧
提示:混合使用两种方法
如果有必要,可以选择混合使用实际列名和相对列位置
指定排序方向
默认的排序方向是递增(从小到大),当然,你也可以指定为递减,只需加上DESC
关键字
例如下面将最贵的商品排在前面
1 | SELECT prod_id, prod_price, prod_name |
如果打算使用多个列排序,该怎么办?下面的例子以降序排序商品,再加上产品名
1 | SELECT prod_id, prod_price, prod_name |
DESC
关键字只应用到单个列上,所以你可以发现价格是单调递减的,而在同一价格中,名称是严格递增的
警告:在多个列上降序排序
如果你想在多个列上进行降序排序,必须在每一列使用DESC关键字
实际上,DESC
是DESCENDING
的缩写,这两个关键字都可以使用,对应的还有ASC
与ASCENDING
(递增),不过显然没什么用,毕竟默认就是递增的