持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情
前言
上篇我们又学习了一部分MySQL中的函数。有兴趣的小伙伴可以阅读(# MySQL学习-函数(十四))。
下面继续学习MySQL中的函数。
HAVING的使用
HAVING用来过滤数据。
示例一
查询各个部门中最高工资比5000高的部门信息。
分析: 这里过滤数据,我们先使用WHERE。
SELECT department_id, MAX(salary)
FROM employees
WHERE MAX(salary) > 5000
GRPUP BY department_id;
运行MySQL,发现报错,这里不能使用WHERE。由此引出要学习的HAVING语句,这里先写一个结论:
结论1: 如果过滤条件中使用了聚合函数,则必须使用HAVING来替换WHERE。否则,报错。
根据结论,我们把WHERE替换成HAVING试一下。
SELECT department_id, MAX(salary)
FROM employees
HAVING MAX(salary) > 5000
GRPUP BY department_id;
运行发现还会报错。这是因为HAVING需要写在GROUP BY的后面。由此得出:
结论2: HAVING 必须声明在GROUP BY的后面。
正确的写法:
SELECT department_id, MAX(salary)
FROM employees
GRPUP BY department_id
HAVING MAX(salary) > 5000;
| department_id | MAX(salary) |
|---|---|
| 1 | 6800.00 |
运行可以得出过滤后的结果。这是正确的。而且HAVING在使用的前提是使用了GROUP BY语句。
总结一下3个结论:
结论1: 如果过滤条件中使用了聚合函数,则必须使用HAVING来替换WHERE。否则,报错。
结论2: HAVING 必须声明在GROUP BY的后面。
结论3: 开发中,我们使用 HAVING 的前提是使用了GROUP BY语句。
示例二
查询部门1,20,30,40这4个部门中最高工资比5000高的部门信息。
方式一
使用WHERE语句过滤部门。
SELECT department_id, MAX(salary)
FROM employees
WHERE department_id IN (1,20,30,40)
GRPUP BY department_id
HAVING MAX(salary) > 5000;
| department_id | MAX(salary) |
|---|---|
| 1 | 6800.00 |
方式二
将过滤语句放在HAVING中运行。
SELECT department_id, MAX(salary)
FROM employees
GRPUP BY department_id
HAVING MAX(salary) > 5000 AND department_id IN (1,20,30,40);
| department_id | MAX(salary) |
|---|---|
| 1 | 6800.00 |
这种方式也可以得出结果。
从结果中可以看出,HAVING也可以替换WHERE来过滤结果。那为什么还要使用WHERE语句呢?因为使用WHERE语句的执行效率高于方式二使用HAVING的方式。具体原因后面再阐述,我们先总结一个结论。
结论:
- 当过滤条件中有聚合函数时,则此过滤条件必须声明在HAVING中。
- 当过滤条件中没有聚合函数时,则此过滤条件声明在WHERE中或HAVING中都可以。但是,建议声明在 WHERE中。
WHERE和HAVING的对比
- 从适用范围上来讲,HAVING的适用范围更广。
- 如果过滤条件中没有聚合函数:这种情况下,WHERE的执行效率要高于HAVING。
开发中怎么选择什么时候使用WHERE,什么时候使用HAVING呢: WHERE和HAVING并不是互相排斥的,我们可以在一个查询里面同时使用WHERE和HAVING。包含聚合函数的条件使用HAVING,普通条件使用WHERE。这样,我们就既利用了WHERE条件的高效快速,又发挥了HAVING可以使用聚合函数的查询条件的优点。当数据量特别大的时候,运行效率会有很大差别。
为什么WHERE的执行效率更高呢?今天先学习到这里,明天再学习总结效率高的原因。