MySQL HAVING的使用
HAVING 子句的用途
HAVING
子句通常用于 SQL 查询中,用于对聚合结果进行过滤。它与 WHERE 子句的区别在于,WHERE 子句在数据分组和聚合之前对行进行过滤,而 HAVING 子句在数据分组和聚合之后对结果进行过滤。
HAVING 的主要用途:
-
过滤聚合结果:
当你使用聚合函数(如 SUM(), COUNT(), AVG(), MAX(), MIN() 等)时,HAVING 子句用于过滤这些聚合结果。例如,过滤出销售总额大于一定值的销售人员。 -
基于计算列进行过滤:
HAVING 子句还可以用于过滤基于计算列的结果,这些计算列在 SELECT 子句中生成。例如,你的查询中计算出的 state 列。
示例
- 使用 HAVING 过滤聚合结果
SELECT department, SUM(salary) AS total_salary
FROM employees
GROUP BY department
HAVING total_salary > 100000;
这将返回每个部门的总工资,并且只包含那些总工资超过 100000 的部门。
2. 使用 HAVING 过滤计算列
SELECT *,
IF(`switch` = 0 OR NOW() > `end_time`, 2,
IF(`is_pause` = 1, 3,
IF(NOW() < `start_time`, 0, 1))) AS `state`
FROM `activity`
WHERE `del` = 0
HAVING `state` = 2
ORDER BY `id` DESC;
这将返回 activity 表中的所有列,并计算出 state 列,然后只包含 state 为 2 的行。
HAVING 后面可以拼接 AND 吗?
可以在 HAVING 子句后面拼接 AND 来添加更多的过滤条件。HAVING 子句可以包含多个条件,就像 WHERE 子句一样。多个条件可以使用 AND 和 OR 组合。
示例
以下是一个包含多个条件的 HAVING 子句的示例:
SELECT department, SUM(salary) AS total_salary
FROM employees
GROUP BY department
HAVING total_salary > 100000 AND COUNT(employee_id) > 10;
这将返回每个部门的总工资,并且只包含那些总工资超过 100000 且员工数量超过 10 的部门。
结合 HAVING 和 WHERE
可以同时使用 WHERE 和 HAVING 子句。例如:
SELECT department, SUM(salary) AS total_salary
FROM employees
WHERE status = 'active'
GROUP BY department
HAVING total_salary > 100000 AND COUNT(employee_id) > 10;
在这个查询中,WHERE 子句首先过滤出状态为 active 的员工,然后 GROUP BY 按部门分组,最后 HAVING 子句过滤出总工资超过 100000 且员工数量超过 10 的部门。
评论区