排序
到目前为止,数据检索结果的排列顺序取决于数据库系统所决定的排序机制,这种排序机制可能是按照数据的输入顺序决定的,也有可能是按照其他的算法来决定的。在有的情况下我们需要按照某种排序规则来排列检索结果,比如按照工资从高到低的顺序排列或者按照姓名的字符顺序排列等。SELECT语句允许使用ORDER BY子句来执行结果集的排序方式。
ORDER BY子句位于SELECT语句的末尾,它允许指定按照一个列或者多个列进行排序,还可以指定排序方式是升序(从小到大排列)还是降序(从大到小排列)。比如下面的SQL语句演示了按照年龄排序所有员工信息的列表:
SELECT * FROM T_Employee ORDER BY FAge ASC
执行完毕我们就能在输出结果中看到下面的执行结果,可以看到输出结果已经按照FAge字段进行升序排列了:
这句SQL中的“ORDER BY FAge ASC”指定了按照FAge字段的顺序进行升序排列,其中ASC代表升序。因为对于ORDER BY子句来说,升序是默认的排序方式,所以如果要采用升序的话可以不指定排序方式,也就是“ASC”是可以省略的,比如下面的SQL 语句具有和上面的SQL语句等效的执行效果:
SELECT * FROM T_Employee ORDER BY FAge
执行完毕我们就能在输出结果中看到下面的执行结果,可以看到输出结果同样按照FAge字段进行升序排列了。
如果需要按照降序排列,那么只要将ASC 替换为DESC 即可,其中DESC 代表降序。执行下面的SQL语句:
SELECT * FROM T_Employee ORDER BY FAge DESC
执行完毕我们就能在输出结果中看到下面的执行结果,可以看到输出结果已经按照FAge字段进行降序排序了:
可以看到上面的检索结果中有几组年龄相同的记录,这些年龄相同的记录之间的顺序是由数据库系统决定的,但是有时可能需要需要完成“按照年龄从大到小排序,如果年龄相同则按照工资从大到小排序”之类的排序功能。这可以通过指定多个排序规则来完成,因为ORDER BY语句允许指定多个排序列,各个列之间使用逗号隔开即可。执行下面的SQL语句:
SELECT * FROM T_Employee ORDER BY FAge DESC,FSalary DESC
可以看到年龄相同的记录按照工资从高到低的顺序排列了。
对于多个排序规则,数据库系统会按照优先级进行处理。数据库系统首先按照第一个排序规则进行排序;如果按照第一个排序规则无法区分两条记录的顺序,则按照第二个排序规则进行排序;如果按照第二个排序规则无法区分两条记录的顺序,则按照第三个排序规则进行排序;……以此类推。以上面的SQL 语句为例,数据库系统首先按照FAge 字段的降序进行排列,如果按照个排序规则无法区分两条记录的顺序,则按照FSalary字段的降序进行排列。
ORDER BY子句完全可以与WHERE子句一起使用,唯一需要注意的就是ORDER BY子句要放到WHERE子句之后,不能颠倒它们的顺序。比如我们尝试执行下面的SQL语句:
SELECT * FROM T_Employee ORDER BY FAge DESC,FSalary DESC WHERE FAge>23
执行以后数据库系统会报错提示此语句有语法错误,如果我们颠倒ORDER BY和WHERE子句的位置则可以执行通过:
SELECT * FROM T_Employee WHERE FAge>23 ORDER BY FAge DESC,FSalary DESC
执行完毕我们就能在输出结果中看到执行结果。
前面我们提到,如果没有为SELECT 语句指定ORDER BY子句,数据库系统会按照某种内置的规则对检索结果进行排序。如果您对检索结果的前后排列顺序有要求,那么即使数据库系统返回的检索结果符合要求也最好显式的指定ORDER BY子句,因为这种系统提供的排序方式是不稳定的,不仅在不同数据库系统之间存在差异,而且即使对同一种数据库系统来说在不同的条件下这种排序方式也是有可能发生改变的。