1.1.5 数据的排序
SELECT语句可以使用的最后一个子句是ORDER子句。以前在查询数据时,数据显示的顺序是不可预知的。如果要对数据进行某种方式的排序,就要借助于ORDER子句。ORDER子句的语法格式为:
ORDER BY列1排序方式,列2排序方式……
ORDER子句对查询到的数据按照指定列的大小排序。如果指定了多个排序列,则首先按照第一个排序列排序,如果这个列的值相同,则再按照第二个排序列继续排序。排序方式包括ASC和DESC,分别表示升序排序和降序排序,二者可选其一,默认的排序方式是升序排序。如果指定了多个排序列,可以为每个排序列单独指定排序方式。
例如,要对公司各部门的工资统计情况进行排序,要求是按照工资总和从大到小排序,如果工资总和相同,再按照部门号从小到大排序。相应的SELECT语句为:
SQL>SELECT deptno AS部门号,avg(sal)AS平均工资,min(sal)AS最低工资,
max(sal)AS最高工资,sum(sal)AS工资总和
FROM emp
GROUP BY deptno
ORDER BY sum(sal)desc, deptno asc
这条SELECT语句的执行结果为:
部门号
平均工资
最低工资
最高工资
工资总和
30
1566.66667 950
2850
9400
10
2916.66667 1300
5000
8750
20
2258.33333 800
3000
6775
ORDER子句中的排序列可以是列名,可以是列的别名,也可以是其他的表达式,还可以是它在SELECT语句中的排列序号。例如上述SELECT语句中的第一个排序列就是一个函数,这个函数可以用前面定义的别名“工资总和”来代替,也可以用它的排列序号5来代替。上面的ORDER子句可以改为等价的形式:
ORDER BY 5 desc,部门号asc
如果在SELECT语句中用到了所有的子句,那么将构成一条复杂的SQL语句。这些子句的使用顺序是:WHERE子句、GROUP子句、HAVING子句、ORDER子句。现在我们再来看一个综合的例子,在这个例子中用到了SELECT语句的所有子句。假设要求按照部门号对员工的工资进行统计,参加统计的员工工资必须大于1000元,将统计结果中凡满足最低工资在900元以上,并且工资总和在7000元以上的部门统计信息显示出来,显示时按照工资总和从大到小排序,如果工资总和相同,再按照部门号从小到大排序。相应的SELECT语句为:
SQL>SELECT deptno AS部门号,avg(sal)AS平均工资,min(sal)AS最低工资,
max(sal)AS最高工资,sum(sal)AS工资总和
FROM emp
WHERE sal>1000
GROUP BY deptno
HAVING min(sal)>900 AND sum(sal)>7000
ORDER BY 5 desc,部门号asc
统计的结果如下所示。与以前的统计结果相比,这次的结果不同,原因是这次统计时设置了WHERE子句中的条件,如果不满足这个条件,就不会被查询到,当然就没有机会参加统计了。
部门号 平均工资 最低工资 最高工资 工资总和
10 2916.66667 1300 5000 8750
30 1690 1250 2850 8450