1、分组统计查询
1.1 统计函数(分组函数)
在之前学习过一个COUNT()函数,此函数的功能是用于统计一张表中的数据量,那么实际上这就属于一种统计函数,在SQL语法中,定义了五个常用的统计函数:COUNT()、SUM()、AVG()、MAX()、MIN()。
范例:要求查询出公司总人数、每月支付的总工资、以及公司的平均工资、最高工资、最低工资。
SELECT COUNT(*),SUM(sal),AVG(sal),MAX(sal),MIN(sal) FROM emp;
范例:求出公司雇佣雇员之中,最早和最晚的雇佣日期。
SELECT MIN(hiredate),MAX(hiredate) FROM emp;
针对于以上的几个统计函数,还有一些非常重要的说明:
说明一: 给出的五个函数之中,如果内统计的数据表之中没有任何数据存在,那么只有COUNT()函数返回数据。
SELECT COUNT(*),SUM(sal),AVG(sal),MAX(sal),MIN(sal) FROM bonus;
发现只有 COUNT() 函数返回了0,其他的函数返回的数据都是NULL,所以得出结论:COUNT()函数不管表中是否有内容,永远都会有一个具体的数据返回。
说明二: 关于COUNT()函数使用的问题
在现在已知使用的 COUNT() 函数采用的方式 “COUNT(*)” , 实际上也可以使用 “COUNT(字段)” 来完成,例如,现在观察如下代码。
SELECT COUNT(*),COUNT(empno) FROM emp;
面试题: 请说出”COUNT(*)”,”COUNT(DISTINCT 字段)”还有”COUNT(字段)”的区别?
SELECT COUNT(*),COUNT(empno),COUNT(DISTINCT job),COUNT(comm) FROM emp;
COUNT(*):可以直接准确的返回表中的数据;
COUNT():如果此字段上的内容不为NULL,其结果与COUNT()一致,如果有NULl数据,则NULL不统计;
COUNT(DISTINCT 字段):重复的数据不统计。
1.2、分组统计
在学习分组统计之前,首先来思考一个问题,什么情况下可能会出现分组的问题?
例如:生活之中,男女厕所是分开的,如果说现在要求男生和女生个一组,按照每个部门分组进行拔河比赛。所以所谓的分组一定是要求有重复,如果换回到数据库之中,就意味者列上存在重复。但是也不排除一个人一组,只是这样做的意义不大。但是分组之后就应该可以进行统计操作了,就可以使用统计函数了。
如果要想在SQL之中实现分组,可以使用如下语法完成,增加一个 GROUP BY 子句。
SELECT [DISTINCT] 列 [别名] | 统计函数
FROM 表名称 [别名], 表名称 [别名], .....
[WHERE 条件(s)]
[GROUP BY 分组字段]
[ORDER BY 字段 [ASC | DESC], 字段 [ASC | DESC], ....]
范例:要求查询出每种职位的雇佣人数、平均工资,应该按照 job 分组。
SELECT job,COUNT(empno),AVG(sal)
FROM emp
GROUP BY job;
范例:按照部门编号分组,求出每个部门的人数,平均工资,最高及最低工资
。应该按照deptno分组。
SELECT deptno,COUNT(deptno),AVG(sal),MAX(sal),MIN(sal)
FROM emp