SQL学习 数据排序和分组

时间:2022-08-03 19:21:13

学习《SQL入门经典》第五版     Ryan Stephens,Ron Plew,Arie D.Jones 著   第十章


本章的重点内容包括:

为何相对数据进行分组

GROUP BY子句

分组估值函数

分组函数的使用方法

根据字段进行分组

GROUP BY 与 ORDER BY

HAVING子句


10.1为什么要对数据进行分组

数据分组是按照逻辑次序把具有重复值的字段进行合并。

数据分组是通过在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语句(暂时先只作了解)

在某些情况下,对分组数据进行小计是很有用的。

ROLLUP语句可以用来进行小计,即在全部分组数据的基础上,对其中的一部分惊醒汇总。

CUBE语句对分组列表中的所有字段进行排列组合,并根据每一种组合结果,分别进行统计汇总。


10.5 HAVING子句

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问与答