GROUP BY, HAVING, COMPUTE, ORDER BY 语句

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子句,是因为它们可以有助于查看和输出用于测试应用程序的结果集。但是,它们产生的额外汇总记录不符合关系型格式,所以它们不适合作为产品数据库的输出。
posted @ 2010-07-07 15:07  类型安全的心  阅读(1384)  评论(0编辑  收藏  举报