数据的排序与分组语句(二)

2014-11-24 10:42:57 · 作者: · 浏览: 1
P BY子句的分组结果进行排序的话,就需要使用ORDER BY子句。
SELECT dept,profession,MAX(salary)
FROM T_teacher
GROUP BY dept
ORDER BY MAX(salary) DESC
按照GROUP BY后分得的各组中的最高工资给组排序;而如下语句则是按照每组的第一行的工资给组排序。
SELECT dept,profession,MAX(salary)
FROM T_teacher
GROUP BY dept
ORDER BY salary DESC
GROUP BY子句中处理NULL值
在使用GROUP BY子句对对指定列进行分组时,有时可能会遇到指定列中含有NULL值的情况。此时,GROUP BY子句会将该列中所有的NULL值归为一组。
如果要得到每个分组中的工资的最大值对应的行(而不是分组的第一行),可以使用子查询等方法,详细以后讨论。
select teaName,salary
from (select * from t_teacher order by salary desc) temp
group by dept
order by salary
4.使用ROLLUP关键字统计数据
在实际应用中,有时不仅需要得到分组后的统计结果,还希望对分组的统计结果做进一步的计算,例如通过对教师信息表(T_teacher)中的院校和教师职称进行分组,得到分组后教师的工资,还希望对每一个院系中的教师的工资做一个阶段性的统计,希望得到各个院校中不同职称的教师的工资的加和(相当于小计),还希望得到所有院校不同职称教师工资的总和(相当于总计)。这个时候仅仅使用GROUP BY子句是无法做到的,此时就需要使用ROLLUP关键字。
ROLLUP关键字使用时需要放到GROUP BY关键字的后面。ROLLUP关键字在不同的数据库中的使用方式上稍有不同。
a.在MySQL和Microsoft SQL Server数据库中需要使用WITH ROLLUP。其语法格式如下:
GROUP BY 列名1 WITH ROLLUP
其中列名1表示要对该列进行分组,WITH ROLLUP关键字表示要对分组的结果进行统计。当然也可以对多个列进行分组,并统计分组后的结果。其语法格式如下:
GROUP BY 列名1 ,列名2 WITH ROLLUP
b.在 Oracle数据库中,ROLLUP关键字需要紧跟在GROUP BY关键字的后面,然后再写需要分组的字段。其语法格式如下:
GROUP BY ROLLUP (列名1,列名2…)
5.限制结果集行数
有些时候,开发人员或者用户并不希望将查询结果的数据列中的数据全部显示出来,而是只希望显示其中的几行,尤其是在需要分页的操作中。例如,一个数据表最后查询出了100条记录,而开发人员或者用户只关心其中前10条记录的值,这就需要对查询结果中的数据记录的行数进行限制。在不同的数据库中限制结果集行数的方法也不尽相同。
a.在MySQL数据库中限制结果集行数可以使用LIMIT关键字,它可以用来限制查询出来的数据结果的个数。通过使用LIMIT关键字可以让开发人员或者用户得到其中想要的部分的结果。如果要使用LIMIT限制结果集行数,可以使用下面的语法格式。
LIMIT n
其中LIMIT是关键字,数字n表示要限制结果集行数。
SELECT teaID,teaName,dept,profession
FROM T_teacher
ORDER BY teaID
LIMIT 3
-- 升序排序后的前3条记录
LIMIT 3,3
-- 升序排序后的第4条到第6条记录
b.Oracle数据库中不支持类似于 MySQL 中的 LIMIT关键字来限制结果集行数,但是在 Oracle数据库中可以使用ROWNUM关键字限制结果集的行数。其语法格式如下:
WHERE ROWNUM
其中ROWNUM关键字表示对符合条件结果的序列号,它的起始值总是从1开始的。数字n表示要限制的结果集的行数。当然,这里的比较运算符除了可以使用(<)小于以外,还可以使用(<=)小于等于。
c.MySQL数据库和Oracle数据库中使用LIMIT关键字和ROWNUM的方法限制结果集行数,在Microsoft SQL Server数据库中需要使用TOP关键字。其语法格式如下:
SELECT TOP n [PRECENT] 列名1,列名2 …
FROM 表名
其中,TOP是表示限制结果集行数的关键字;数字n表示限制结果集行数;PRECENT关键字表示返回查询的结果集中前n%的行数,它是可选的。