GROUP BY用于对表或者视图的数据按字段分组:
例如:
求各专业的学生人数:
USE Students SELECT 专业名, COUNT(*) AS '学生数' FROM XS GROUP BY 专业名
产生一个结果集,包括每个专业的男生人数,女生人数,总人数及学生总人数
USE Students SELECT 专业名, 性别, COUNT(*) AS '人数' FROM XS GROUP BY 专业名,性别 WITH ROLLUP
计算机 0 3
计算机 1 8
计算机 NULL 11
通信工程 0 1
通信工程 1 1
通信工程 NULL 2
NULL NULL 13
带有WITH ROLLUP将会生成一个汇总行。
如果使用WITH CUBE:
USE Students SELECT 专业名, 性别, COUNT(*) AS '人数' FROM XS GROUP BY 专业名,性别 WITH CUBE
结果如下:
计算机 0 3
通信工程 0 1
NULL 0 4
计算机 1 8
通信工程 1 1
NULL 1 9
NULL NULL 13
计算机 NULL 11
通信工程 NULL 2
CUBE操作符对GROUP BY 子句中的各列的所有可能组合均产生汇总行。
HAVING
使用GROUP BY子句和聚合函数对数据进行分组后,还可以用HAVING子句对分组数据进行进一步的筛选。
例如: 查找平均成绩大于85分的
SELECT 学号, AVG(成绩) AS '平均成绩' FROM XS_KC GROUP BY 学号 HAVING AVG(成绩)>=85
当使用HAVING子句时,注意以下事项和原则:
- HAVING子句只有与GROUP BY子句联用才能对分组进行约束。只使用HAVING子句而不使用GROUP BY子句是没有意义的。
- 可以引用任何出现在选择列表中的列。
- 不要与HAVING子句一起使用ALL关键字,因为HAVING子句会忽略ALL关键字而返回只满足自己条件的分组。
COMPUTE
COMPUTE子句用于分类汇总。COMPUTE将产生额外的汇总行
USE Students SELECT 学号, 姓名, 出生时间 FROM XS WHERE 专业名 = '通信工程' COMPUTE COUNT(学号)
会在一个单独的窗口里面显示COMPUTE里面聚合函数的结果
ORDER BY
ORDER BY子句对查询结果进行排序
系统默认的是ASC升序。要使用降序可以用DESC
将计算机专业的学生按出生日期先后排序
USE Students SELECT 学号, 姓名, 出生时间 FROM XS WHERE 专业名 = '计算机' ORDER BY 出生时间
当使用子句和运算符汇总数据时,注意下面的推荐操作:
- 对经常聚合的列进行索引可以提高查询效率。例如,增加quantity列的索引能加快汇总操作的执行,甚至当使用了ROLLUP运算符时也是如此。
- 在包含空值的列中避免使用聚合函数,因为结果集可能并没有正确地返回你要查询的数据。
在结果集中使用ORDER BY子句以保证返回数据的排列顺序。如果不使用ORDER BY子句,SQL Server就不保证结果顺序。 - 因为ROLLUP运算符比CUBE运算符更高效,所以只要可能就使用它。ROLLUP运算符之所以高效是因为它把汇总数据作为具体数据处理。CUBE运算符在执行时需要大量的运算,所以它需要更多的资源。
- 使用COMPUTE或COMPUTE BY子句,是因为它们可以有助于查看和输出用于测试应用程序的结果集。但是,它们产生的额外汇总记录不符合关系型格式,所以它们不适合作为产品数据库的输出。