本文章通过学习《慕课网》学习所得
聚合函数
聚合函数可以对数据求和、求最大值和最小值、求平均值等等。
AVG平均值函数
AVG函数用于获得非空值的平均值,非数字数据统计结果为0
//求平均值
SELECT
AVG(sal+IFNULL(comm,0))
FROM t_emp;
SUM 求和函数
SELECT SUM(ename) FROM t_emp;
MAX函数
MAX函数用于获得非空值的最大值
SELECT MAX(comm) FROM t_emp;
COUNT函数
count(*)用于获得包含空值的记录数,COUNT(列名)用于获得包含非空值的记录数
SELECT
COUNT(*),COUNT(comm)
FROM t_emp;
例子
//查询10和20部门中,底薪超过2000元并且工龄超过15年的员工人数
SELECT COUNT(*)
FROM t_emp
WHERE deptno IN(10,20) AND sal>=2000
AND DATEDIFF(NOW(),HIREDATE)/365>=1;
分组查询
可以更加复杂一点
round()四舍五入函数
//查询1985年以后入职的员工,底薪超过公司平均底薪的员工数量
//采用分组查询
SELECT deptno,ROUND(AVG(sal))
FROM t_emp GROUP BY deptno
逐级分组
GROUP BY子句的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对每个小区与分别进行数据汇总处理
// 分组查询中的某个个字段拼接成一个字符串
SELECT deptno,GROUP_COUNT(ename),COUNT(*)
FROM t_emp WHERE SAL>=2000
GROUP BY deptno;
HAVING子句
HAVING子句和where子句是相通的,但是WHERE子句在GROUP BY子句先执行,HAVING子句在GROUP BY子句后执行
问题:查询部门平均底薪超过2000元的部门编号
//错误示范
SELECT deptno
FROM t_emp
WHERE AVG(sal) >= 2000
GROUP BY deptno;
分组的时候已经执行了聚合函数
// 正确执行方法
SELECT deptno
FROM t_emp
GROUP BY deptno HAVING AVG(sal) >= 2000;
HAVING子句的用途
问题:查询每个部门中,1982年以后入职的员工超过两个人的部门编号
SELECT deptno
FROM t_emp
WHERE hiredate >= "1982-01-01"
GROUP BY deptno HAVING COUNT(*) >= 2;
order BY deptno ASC;