聚合函数 值作用域 非 Null 数据, 所以在 聚合之前 需要检查 数据是否为 Null
1. count 返回 不为 null 的数据 记录数 count(*) 等价于 count(1)
COUNT 使用比较多的 场景 就是 数据分页
SELECT COUNT(*) FROM emp;
SELECT COUNT(work_type) FROM emp;
2. sum 对字段列进行 求和
NUll 和 一个 数 相加 得到 NULL
所以在求 和 的时候 一般要先判断 是否 为 null, 所以需要 ifNull 先进性 判断
SELECT IFNULL(COMM,0) + IFNULL(SAL,0 ) as total FROM emp;
SELECT SUM( IFNULL(COMM,0) + IFNULL(SAL,0 ) ) FROM emp;
3. avg 对数据进行 平均值 的计算
SELECT AVG( IFNULL(COMM,0) ) FROM emp;
SELECT AVG( IFNULL(COMM,0) ), AVG( IFNULL(SAL,0) ) FROM emp;
4. max 和 min 求 最大值 和 最 小值
SELECT MAX(COMM), MIN(SAL) FROM emp;
1. group by
将查询 结果按照 1个 或多个 字段 进行分组, 字段相同的是为一组, 归类
2,注意事项
当 group by 单独使用时, 只显示分组 的 第一条记录,所以 一般不会单独使用, 在使用 分组时,分组后的 字段 一般作 为前面的返回字段
*单独使用 指的 是 没有配合 聚合 函数一起使用
3. group concat(字段)
分组后, 根据分组结果 将某些字段 串起来输出
group by 分类 之后 统计 每 个 分类的 具体 个数情况, 串起来 输出,以 逗号分隔
SELECT edeptno , GROUP_CONCAT(ename) FROM emp GROUP BY edeptno
* 统计男女性别 对应的 所以姓名
SELECT sex ,GROUP_CONCAT(ename) FROM emp GROUP BY sex;
* 统计部门下的 人的 性别
SELECT edeptno, GROUP_CONCAT(work_age) FROM emp GROUP BY edeptno ;
4. 分组 和 聚合函数 一起啊使用
查询 每个部门 的 名称 和 每个部门的薪资 总和 (按部门编号分组)
SELECT edeptno, SUM( IFNULL(sal,0) ) FROM emp GROUP BY edeptno;
查询男性和女性 的平均 工龄 (按性别分类)
SELECT sex , AVG( IFNULL(work_age,0) ) FROM emp GROUP BY sex;
查询 每个部门的 部门名称 以及 每个部门 工资大于 1500 的人数 (按部门编号分组)
SELECT edeptno , COUNT(*) FROM emp WHERE SAL > 200 GROUP BY edeptno;
1. having 用于分组后的再次筛选, where 用于分组前的 数据筛选
2. having 和 where 条件的作用一样, 但只能 用于 分组 group by,
查询 [薪资总和] 大于 50 的部门 id
SELECT edeptno , SUM(IFNULL(SAL,0)) FROM emp
GROUP BY edeptno HAVING SUM(IFNULL(SAL,0)) > 50
3. having 和 where 条件的区别
查询员工 工资大于 50,工资总和大于 100 的 部门名称 以及工资总和,按照 总和 倒叙排列
对于比较 复杂 的查询 ,拆分 需求
SELECT edeptno , SUM( IFNULL(SAL,0)) FROM emp
WHERE SAL > 50 GROUP BY edeptno
HAVING SUM( IFNULL(SAL,0)) > 1000
ORDER BY SUM( IFNULL(SAL,0)) DESC
简化:
SELECT edeptno , SUM( IFNULL(SAL,0)) as total FROM emp
WHERE SAL > 50 GROUP BY edeptno
HAVING total > 1000
ORDER BY total DESC
本节代码
SELECT edeptno , GROUP_CONCAT(ename) FROM emp GROUP BY edeptno
ALTER TABLE emp ADD COLUMN sex CHAR(1) COMMENT '性别';
ALTER TABLE emp MODIFY sex CHAR(1) DEFAULT '1' COMMENT '性别';
ALTER TABLE emp DROP COLUMN sex;
ALTER TABLE emp ADD COLUMN sex CHAR(1) DEFAULT '1' COMMENT '性别';
SELECT sex ,GROUP_CONCAT(ename) FROM emp GROUP BY sex;
SELECT edeptno, GROUP_CONCAT(work_age) FROM emp GROUP BY edeptno ;
SELECT edeptno, SUM( IFNULL(sal,0) ) FROM emp GROUP BY edeptno;
SELECT sex , AVG( IFNULL(work_age,0) ) FROM emp GROUP BY sex;
SELECT edeptno , COUNT(*) FROM emp WHERE SAL > 200 GROUP BY edeptno;
SELECT edeptno , SUM(IFNULL(SAL,0)) FROM emp
GROUP BY edeptno HAVING SUM(IFNULL(SAL,0)) > 50
SELECT edeptno , SUM( IFNULL(SAL,0)) FROM emp
WHERE SAL > 50 GROUP BY edeptno
HAVING SUM( IFNULL(SAL,0)) > 1000
ORDER BY SUM( IFNULL(SAL,0)) DESC
练习题:
1.查询 20 号部门 的所有员工人数 聚合查询
SELECT COUNT(*) FROM emp WHERE edeptno = 20
2.查询 每个 部门 中 奖金最高的奖金
SELECT edeptno , MAX(SAL) FROM emp GROUP BY edeptno
3.查询每个部门的 平均 薪资 和奖金汇总
SELECT edeptno, AVG(SAL) , SUM(COMM) FROM emp GROUP BY edeptno;
4.查询 30 号部门的 平均 工资
SELECT AVG(SAL) FROM emp WHERE edeptno = 30
5.查询 所有 工种 不是 MANAGER 和 CLIERK, 部门工资总和 大于 55 部门名称 以及 资总 总和, 按照倒叙 显示
SELECT edeptno, SUM(SAL) FROM emp
WHERE work_type != 'MANAGER' AND work_type != 'CLERK'
GROUP BY edeptno
HAVING SUM(SAL) > 55
ORDER BY SUM(SAL) DESC
SELECT edeptno, SUM(SAL) FROM emp
WHERE work_type NOT IN('MANAGER', 'CLERK' )
GROUP BY edeptno
HAVING SUM(SAL) > 55
ORDER BY SUM(SAL) DESC
SELECT edeptno, SUM(SAL) FROM emp
WHERE work_type NOT IN('MANAGER', 'CLERK' )
GROUP BY edeptno
HAVING SUM(SAL) > 55 AND SUM(SAL) < 10000
ORDER BY SUM(SAL) DESC
Having 中科院使用 AND OR IN NOT IN 等等 修饰
SELECT COUNT(*) FROM emp WHERE edeptno = 20
SELECT edeptno , MAX(SAL) FROM emp GROUP BY edeptno
SELECT edeptno, AVG(SAL) , SUM(COMM) FROM emp GROUP BY edeptno;
SELECT AVG(SAL) FROM emp WHERE edeptno = 30
SELECT edeptno, SUM(SAL) FROM emp
WHERE work_type != 'MANAGER' AND work_type != 'CLERK'
GROUP BY edeptno
HAVING SUM(SAL) > 55
ORDER BY SUM(SAL) DESC
SELECT edeptno, SUM(SAL) FROM emp
WHERE work_type NOT IN('MANAGER', 'CLERK' )
GROUP BY edeptno
HAVING SUM(SAL) > 55 AND SUM(SAL) < 10000
ORDER BY SUM(SAL) DESC
SELECT * FROM emp LIMIT 0,3; 132
SELECT * FROM emp LIMIT 3,3; 465
SELECT * FROM emp LIMIT 5; 13245 前五