你好,我是风一样的树懒,一个工作十多年的后端开发,曾就职京东、阿里等多家互联网头部企业。
在 MySQL 中,HAVING 是一个非常有用的关键字,它常用于在 GROUP BY 聚合查询后对聚合结果进行过滤。
HAVING 和 WHERE 都用于过滤数据,但它们的作用范围不同。
WHERE 是在数据分组(GROUP BY)或聚合计算之前过滤数据。
HAVING 是在数据分组(GROUP BY)或聚合计算之后对分组结果进行过滤。
HAVING 通常与聚合函数(如 SUM()、COUNT()、AVG() 等)一起使用。
SELECT column1, column2, AGGREGATE_FUNCTION(column3)
FROM table_name
WHERE condition
GROUP BY column1, column2
HAVING aggregate_condition
ORDER BY column1;
当我们想对分组后的结果应用条件时,HAVING 就派上用场。
SELECT department_id, SUM(salary) AS total_salary
FROM employees
GROUP BY department_id
HAVING SUM(salary) > 10000;
先使用 GROUP BY 按部门分组。
对每个分组的工资总和 SUM(salary) 进行计算。
使用 HAVING 过滤出总工资大于 10,000 的部门。
如果既需要在分组前对数据过滤,又需要对分组后的结果过滤,可以同时使用 WHERE 和 HAVING。
SELECT product_id, SUM(sales) AS total_sales
FROM orders
WHERE sales > 50
GROUP BY product_id
HAVING SUM(sales) > 100;
WHERE sales > 50:先过滤出单个销售记录中销售额大于 50 的数据。
GROUP BY product_id:按产品分组。
HAVING SUM(sales) > 100:过滤出分组后总销售额大于 100 的产品。
HAVING 支持多个条件,可以使用 AND 和 OR。
SELECT product_id, SUM(sales) AS total_sales
FROM orders
GROUP BY product_id
HAVING SUM(sales) > 200 AND SUM(sales) < 500;
区别 | WHERE | HAVING |
---|---|---|
作用范围 | 用于过滤原始数据 | 用于过滤分组后的数据 |
是否支持聚合函数 | 不支持 | 支持 |
执行顺序 | 在 GROUP BY 和聚合计算之前执行 | 在 GROUP BY 和聚合计算之后执行 |
统计销售额大于 50 的订单数:
SELECT product_id, COUNT(*) AS order_count
FROM orders
WHERE sales > 50
GROUP BY product_id;
过滤的是原始数据中 sales > 50 的记录。
统计所有订单中,总销售额大于 100 的产品:
SELECT product_id, SUM(sales) AS total_sales
FROM orders
GROUP BY product_id
HAVING SUM(sales) > 100;
过滤的是分组后 SUM(sales) 的结果。
在 SQL 查询中,执行顺序是:
FROM:从数据表中读取数据。
WHERE:过滤原始数据。
GROUP BY:对数据分组。
聚合函数:对每组数据进行聚合计算。
HAVING:对分组后的数据进行过滤。
SELECT:返回最终结果。
ORDER BY:对结果排序。
HAVING 是专门用于过滤分组后的结果的。
当需要基于聚合函数的结果进行过滤时,使用 HAVING。
如果过滤条件仅针对单行数据,则使用 WHERE。
HAVING 和 WHERE 可以配合使用,先用 WHERE 过滤原始数据,再用 HAVING 过滤分组后的结果。
通过这些理解,能更高效地写出复杂的 SQL 查询,同时避免逻辑混乱。
今天的内容就分享到这儿,喜欢的朋友可以关注,点赞。有什么不足的地方欢迎留言指出,您的关注是我前进的动力!