7.数据分组
1.数据分组入门
数据分组用来将数据分为多个逻辑组,从而可以对每个组进行聚合运算。
SELECT FAge FROM T_Employee GROUP BY FAge
GROUP BY子句必须放到WHERE语句的之后:
SELECT FAge FROM T_Employee WHERE FSubCompany = 'Beijing' GROUP BY FAge
需要分组的所有列都必须位于GROUP BY子句的列名列表中,也就是没有出现在GROUP BY子句中的列(聚合函数除外)是不能放到SELECT语句后的列名列表中的。比如下面的SQL语句是错误的:
SELECT FAge,FSalary FROM T_Employee GROUP BY FAge
因为采用分组以后的查询结果集是以分组形式提供的,由于每组中人员的员工工资都不一样,所以就不存在能够统一代表本组工资水平的FSalary字段了,所以上面的
SQL语句是错误的。不过每组中员工的平均工资却是能够代表本组统一工资水平的,所以可以对FSalary使用聚合函数,下面的SQL语句是正确的:
SELECT FAge,AVG(FSalary) FROM T_Employee GROUP BY FAge
GROUP BY子句中可以指定多个列,只需要将多个列的列名用逗号隔开即可。指定多个分组规则以后,数据库系统将按照定义的分组顺序来对数据进行逐层分组,首先按照第一个分组列进行分组,然后在每个小组内按照第二个分组列进行再次分组……逐层分组,从而实现“组中组”的效果,而查询的结果集是以最末一级分组来进行输出的。
SELECT FSubCompany,FDepartment FROM T_Employee GROUP BY FSubCompany,FDepartment
2.数据分组与聚合函数
聚合函数是针对分组后的逻辑数据进行处理,主要有:SUM、AVG、MIN、MAX、COUNT。
下面的SQL可以统计每个部门中员工年龄的最大值和最小值:
SELECT FDepartment,MIN(FAge) AS FAgeMIN,MAX(FAge) AS FAgeMAX FROM T_Employee GROUP BY FDepartment
结果:
3.HAVING 语句
在数据库系统中执行下面的SQL的时候,数据库系统会提示语法错误,这是因为聚合函数不能在WHERE语句中使用:
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge WHERE COUNT(*)>1
必须使用HAVING子句来代替:
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING COUNT(*)>1
HAVING语句能够使用的语法和WHERE几乎是一样的:
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee WHERE FName IS NOT NULL GROUP BY FAge HAVING COUNT(*)>1