到目前为止我们使用聚合函数都是对普通结果集进行统计的,我们同样可以聚合函数来对分组后的数据进行统计,也就是统计每一个分组的数据。我们甚至可以认为这没有使用GROUP BY 的语句中使用聚合函数,不过是在一个整个结果集是一个组的分组数据中进行数据统计分析罢了!
让我们来看一下如何用数据分组来实现“查看你每个年龄段的员工人数”,下面是实现此功能的SQL语句:
SELECT FAge, COUNT(*) AS CountOfThisAge FROM T_Employee GROUP FAge
GROUP BY 子句将检索结果按照年龄划分为多个组,每个组是所有记录的一个子集。在执行上面的SQL例子的时候数据库系统将数据分成了下面的分组:22岁组,23岁组,25岁组,27岁组,28岁组
可以看到年龄相同的员工被分到了一组,接着使用COUNT(*)来统计每一组中的条数,这样就得到了每个年龄段的员工的人数了。
可以使用多个分组来实现更精细的数据统计,比如下面的SQL语句就可以统计每个分公司的年龄段的人数:
SELECT FSubCompany, FAge, COUNT(*) AS CountOfThisSubCompAge From T_Employee GROUP BY FSubCompany, FAge
+-------------+------+----------+
| FSubCompany | FAge | COUNT(*) |
+-------------+------+----------+
| Beijing | 23 | 1 |
| Beijing | 25 | 3 |
| Beijing | 28 | 1 |
| Beijing | 35 | 1 |
| ShenZhen | 27 | 1 |
| ShenZhen | 28 | 1 |
+-------------+------+----------+
上面结果默认是按照公司来排序,包含ORDER BY 的SQL语句如下:
SELECT FSubCompany, FAge, COUNT(*) AS CountOfThisSubCompAge FROM T_Employee GROUP BY FSubCompany, FAge ORDER BY FAge
+-------------+------+-----------------------+
| FSubCompany | FAge | CountOfThisSubCompAge |
+-------------+------+-----------------------+
| Beijing | 23 | 1 |
| Beijing | 25 | 3 |
| ShenZhen | 27 | 1 |
| ShenZhen | 28 | 1 |
| Beijing | 28 | 1 |
| Beijing | 35 | 1 |
+-------------+------+-----------------------+
上面的SQL语句中,GROUP BY子句将检索结果首先按照FSubCompany进行分组,然后在每一个分组内有按照FAge进行分组。
COUNT(*)对每一个分组统计总数,这样就可以统计出每个公司每个年龄段的人数了。
SUM、AVG、MIN、MAX也可以在分组中使用。比如下面的SQL可以统计出每个公司的工资的总值:
SELECT FSubCompany, SUM(FSalary) AS FSalarySUM FROM T_Employee GROUP BY FSubCompany
+-------------+--------------+
| fsubcompany | sum(fsalary) |
+-------------+--------------+
| Beijing | 35000.00 |
| ShenZhen | 5100.00 |
+-------------+--------------+
下面的SQL可以统计每个垂直部门的工资总值:
SELECT FDepartment, SUM(FSalary) AS FSalarySUM FROM T_Employee GROUP BY FDeparyment
+---------------+--------------+
| FDepartment | Sum(FSalary) |
+---------------+--------------+
| Development | 10600.00 |
| HumanResource | 7600.00 |
| InfoTech | 8300.00 |
| Sales | 13600.00 |
+---------------+--------------+
下面的SQL可以统计每个垂直部门员工年龄的最大值和最小值:
SELECT FDeparyment, MIN(FAge) AS FAgeMIN, MAX(FAge) AS FAgeMAX FROM T_Employee GROUP BY FDepartment
+---------------+---------+---------+
| fdepartment | FAgeMIN | FAgeMAX |
+---------------+---------+---------+
| Development | 28 | 25 |
| HumanResource | 25 | 23 |
| InfoTech | 28 | 27 |
| Sales | 35 | 25 |
+---------------+---------+---------+