MySQL学习-函数(十五)

128 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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_idMAX(salary)
16800.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_idMAX(salary)
16800.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_idMAX(salary)
16800.00

这种方式也可以得出结果。

从结果中可以看出,HAVING也可以替换WHERE来过滤结果。那为什么还要使用WHERE语句呢?因为使用WHERE语句的执行效率高于方式二使用HAVING的方式。具体原因后面再阐述,我们先总结一个结论。

结论:

  • 当过滤条件中有聚合函数时,则此过滤条件必须声明在HAVING中。
  • 当过滤条件中没有聚合函数时,则此过滤条件声明在WHERE中或HAVING中都可以。但是,建议声明在 WHERE中。

WHERE和HAVING的对比

  1. 从适用范围上来讲,HAVING的适用范围更广。
  2. 如果过滤条件中没有聚合函数:这种情况下,WHERE的执行效率要高于HAVING。

开发中怎么选择什么时候使用WHERE,什么时候使用HAVING呢: WHERE和HAVING并不是互相排斥的,我们可以在一个查询里面同时使用WHERE和HAVING。包含聚合函数的条件使用HAVING,普通条件使用WHERE。这样,我们就既利用了WHERE条件的高效快速,又发挥了HAVING可以使用聚合函数的查询条件的优点。当数据量特别大的时候,运行效率会有很大差别。

为什么WHERE的执行效率更高呢?今天先学习到这里,明天再学习总结效率高的原因。