学习《SQL入门经典》第五版 Ryan Stephens,Ron Plew,Arie D.Jones 著 第十章
本章的重点内容包括:
10.1为什么要对数据进行分组为何相对数据进行分组
GROUP BY子句
分组估值函数
分组函数的使用方法
根据字段进行分组
GROUP BY 与 ORDER BY
HAVING子句
数据分组是按照逻辑次序把具有重复值的字段进行合并。
数据分组是通过在SELECT语句(查询)里使用GROUP BY子句来实现的。
10.2GROUP BY子句
GROUP BY子句在查询中的位置如下:
SELECT
FROM
WHERE
GROUP BY
ORDER BY
GROUP BY子句对CPU的运行效率有很大影响,所以需要用WHERE来缩小数据范围。
这里也可以加入ORDER BY子句,但RDBMS通常会使用GROUP BY子句中的列序对返回结果进行排序。所以除非用户对返回值的顺序有特殊要求,否则一般不会使用ORDER BY子句。
10.2.1 分组函数
典型的分组函数------也就是用于GROUP BY子句对数据进行划分的函数------包括:
AVG、MAX、MIN、SUM、COUNT
他们是第九章介绍的汇总函数,当时他们用于单个值,现在他们将用于分组值。
10.2.2 对选中的数据进行分组
被选中的字段(查询中SELECT之后的字段列表)才能在GROUP子句里引用;
如果字段在SELECT语句里找不到,就不能用于GROUP BY子句。
达到要求的字段名称必须出现在GROUP BY子句中。
在GROUP BY子句里可以使用字段名称,也可以使用一个整数来代表字段。
分组字段的次序不一定要与SELECT子句里的字段次序相同。
10.2.3 创建分组和使用汇总函数
只要SELECT子句的字段名称是符合条件的,他的名字就必须出现在GROUP BY子句里,除了汇总函数。
下面的SQL语句从表中返回全部薪水的总和:
SELECT SUM(SALARY) AS TOTAL_SALARY
FROM EMPLOYEE_PAY_TBL
TOTAL_SALARY
90000.00
1 ROW SELECTED
下面的SQL语句返回不同薪水的总和:
SELECT SUM(SALARY)
FROM EMPLOYEE_PAY_TBL
GROUP BY SALARY;
SUM(SALARY)
(NULL)
2000.00
3000.00
4000.00
4 ROW SELECTED
下面的范例组合对哦中查询元素返回分组的数据:
SELECT CITY,AVG(PAY_RATE),AVG(SALARY)
FROM EMP_PAY_TMP
WHERE CITY IN ( ' INDIANAPOLIS' , 'WHITELAND' )
GROUP BY CITY
ORDER BY 2,3
10.2.4以整数代表字段名称
略
10.3 GROUP BY 与 ORDER BY
GROUP BY和ORDER BY 的相同之处在于他们都是对数据进行排序。
用GROUP BY 子句实现排序操作的区别与缺点是:
所有被选中的、非汇总函数的字段必须列在GROUP BY子句里;
除非需要使用汇总函数,否则使用GROUP BY子句进行排序通常是没有必要的。
10.4 CUBE和ROLLUP语句(暂时先只作了解)
10.5 HAVING子句在某些情况下,对分组数据进行小计是很有用的。
ROLLUP语句可以用来进行小计,即在全部分组数据的基础上,对其中的一部分惊醒汇总。
CUBE语句对分组列表中的所有字段进行排列组合,并根据每一种组合结果,分别进行统计汇总。
HAVING子句在 SELECT语句里与GROUP BY子句联合使用时,用于高速GROUP BY子句在输出力包含那些分组。
HAVING对于GROUP BY的作用相当于WHERE对于SELECT的作用。
换句话说,WHERE子句设定呗选择字段的条件,而HAVING子句设置GROUP BY子句形成分组的条件。
因此,使用HAVING子句可以让结果里包含或是去除整组的数据。
下面是HAVING子句在查询里的位置:
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
10.6小结
HAING子句是GROUP BY子句的一个扩充,用于对分组添加条件。相比之下,WHERE子句用于给查询的SELECT子句添加条件。
10.7问与答
略