MySQL的聚合函数该如何使用?
1、什么是聚合函数
聚合函数作用于一组数据,并对一组数据返回一个值。
#此代码表明:对员工表的工资这一组数据,返回这组数据的最大值
SELECT MAX(salary) FROM employees;
2、聚合函数类型(常用)
AVG()
SUM()
MAX()
MIN()
COUNT()
需要注意的是: 聚合函数不能嵌套调用,比如不能出现类似“AVG(SUM(字段名称))”形式的调用;不能在WHERE子句中使用聚合函数
3、GROUP BY的使用
SELECT department_id, AVG(salary),job_id
FROM employees
GROUP BY department_id ,job_id;
上面的SQL语句可以学习到:
- 可以使用GROUP BY子句将表中的数据分成若干组
- 在SELECT列表中所有未包含在组函数中的列都应该包含在 GROUP BY子句中,这里说的是应该,不包含也不会报错的
- 可以使用多个列进行分组
SELECT AVG(salary)
FROM employees
GROUP BY department_id ;
上面的SQL语句可以学习到:包含在 GROUP BY 子句中的列不必包含在SELECT 列表中
4、HAVING的使用
HAVING是用来过滤分组后的,而WHERE是在分组前过滤
使用时应该要注意的地方:
- 行已经被分组。
- 使用了聚合函数。
- 满足HAVING 子句中条件的分组将被显示。
- HAVING 不能单独使用,必须要跟 GROUP BY 一起使用。
5、 WHERE和HAVING的对比(笔记原文)
区别1:WHERE 可以直接使用表中的字段作为筛选条件,但不能使用分组中的计算函数作为筛选条件;HAVING 必须要与 GROUP BY 配合使用,可以把分组计算的函数和分组字段作为筛选条件。
这决定了,在需要对数据进行分组统计的时候,HAVING 可以完成 WHERE 不能完成的任务。这是因为,在查询语法结构中,WHERE 在 GROUP BY 之前,所以无法对分组结果进行筛选。HAVING 在 GROUP BY 之后,可以使用分组字段和分组中的计算函数,对分组的结果集进行筛选,这个功能是 WHERE 无法完成的。另外,WHERE排除的记录不再包括在分组中。
区别2:如果需要通过连接从关联表中获取需要的数据,WHERE 是先筛选后连接,而 HAVING 是先连接后筛选。 这一点,就决定了在关联查询中,WHERE 比 HAVING 更高效。因为 WHERE 可以先筛选,用一个筛选后的较小数据集和关联表进行连接,这样占用的资源比较少,执行效率也比较高。HAVING 则需要先把结果集准备好,也就是用未被筛选的数据集进行关联,然后对这个大的数据集进行筛选,这样占用的资源就比较多,执行效率也较低。
开发中的选择:
WHERE 和 HAVING 也不是互相排斥的,我们可以在一个查询里面同时使用 WHERE 和 HAVING。包含分组统计函数的条件用 HAVING,普通条件用 WHERE。这样,我们就既利用了 WHERE 条件的高效快速,又发挥了 HAVING 可以使用包含分组统计函数的查询条件的优点。当数据量特别大的时候,运行效率会有很大的差别。
6、课后练习题加强
#查询各job_id的员工工资的最大值,最小值,平均值,总和
SELECT job_id,MAX(salary),MIN(salary),AVG(salary),SUM(salary)
FROM employees
GROUP BY job_id;
#查询的部分结果:
+------------+-------------+-------------+--------------+-------------+
| job_id | MAX(salary) | MIN(salary) | AVG(salary) | SUM(salary) |
+------------+-------------+-------------+--------------+-------------+
| AC_ACCOUNT | 8300.00 | 8300.00 | 8300.000000 | 8300.00 |
| AC_MGR | 12000.00 | 12000.00 | 12000.000000 | 12000.00 |
| AD_ASST | 4400.00 | 4400.00 | 4400.000000 | 4400.00 |
| AD_PRES | 24000.00 | 24000.00 | 24000.000000 | 24000.00 |
| AD_VP | 17000.00 | 17000.00 | 17000.000000 | 34000.00 |
| FI_ACCOUNT | 9000.00 | 6900.00 | 7920.000000 | 39600.00 |
| FI_MGR | 12000.00 | 12000.00 | 12000.000000 | 12000.00 |
+------------+-------------+-------------+--------------+-------------+
# 查询每个工种、每个部门的部门名、工种名和最低工资
#这里用到了多表查询和多列分组
SELECT t1.department_name,t2.job_id,MIN(salary)
FROM departments t1 LEFT JOIN employees t2
ON t1.`department_id` = t2.`department_id`
GROUP BY department_name,job_id;
#查询的部分结果:
+----------------------+------------+-------------+
| department_name | job_id | MIN(salary) |
+----------------------+------------+-------------+
| Administration | AD_ASST | 4400.00 |
| Marketing | MK_MAN | 13000.00 |
| Marketing | MK_REP | 6000.00 |
| Purchasing | PU_MAN | 11000.00 |
| Purchasing | PU_CLERK | 2500.00 |
| Human Resources | HR_REP | 6500.00 |
| Shipping | ST_MAN | 5800.00 |
| Shipping | ST_CLERK | 2100.00 |
| Shipping | SH_CLERK | 2500.00 |
+----------------------+------------+-------------+
爱在结尾:自己要懂得:1、having和where的区别 ; 2、group by和having在使用上的注意点。
转载自:https://juejin.cn/post/7129856610494578702