HAVING用于筛选分组后的聚合结果,WHERE用于过滤分组前的原始行数据;执行顺序上WHERE先于GROUP BY,HAVING在GROUP BY之后,二者可结合使用以提升查询效率。

HAVING
GROUP BY
WHERE
WHERE
HAVING
COUNT()
SUM()
AVG()
MAX()
MIN()
HAVING
使用
HAVING
GROUP BY
SELECT
column1,
aggregate_function(column2)
FROM
table_name
GROUP BY
column1
HAVING
aggregate_function(column2) [comparison_operator] value;举个例子,假设我们有一个
orders
customer_id
amount
SELECT
customer_id,
SUM(amount) AS total_spent
FROM
orders
GROUP BY
customer_id
HAVING
SUM(amount) > 1000;这里,
SUM(amount)
HAVING SUM(amount) > 1000
HAVING
WHERE
SUM(amount)
WHERE
这真的是SQL初学者,甚至是一些有经验的开发者都会偶尔混淆的点。我个人觉得,理解它们的执行时机是关键。
WHERE
WHERE
COUNT()
SUM()
而
HAVING
GROUP BY
HAVING
HAVING
什么时候用哪个?
用WHERE
-- 找出2023年单笔订单金额超过100的所有订单 SELECT order_id, customer_id, amount FROM orders WHERE order_date BETWEEN '2023-01-01' AND '2023-12-31' AND amount > 100;
用HAVING
-- 找出平均订单金额超过200的客户 SELECT customer_id, AVG(amount) AS avg_order_amount FROM orders GROUP BY customer_id HAVING AVG(amount) > 200;
有时候,两者甚至会一起出现。比如,我们想找出2023年那些总订单金额超过1000的客户。这时,先用
WHERE
GROUP BY
HAVING
SELECT
customer_id,
SUM(amount) AS total_spent
FROM
orders
WHERE
order_date BETWEEN '2023-01-01' AND '2023-12-31' -- 先筛选2023年的订单
GROUP BY
customer_id
HAVING
SUM(amount) > 1000; -- 再筛选总金额大于1000的客户这种组合使用非常常见,也是写出高效且精确SQL的关键。
HAVING
WHERE
AND
OR
NOT
想象一个场景:我们想找出那些平均订单金额超过500,并且总订单数至少有3个的客户。
SELECT
customer_id,
AVG(amount) AS avg_order_amount,
COUNT(order_id) AS total_orders
FROM
orders
GROUP BY
customer_id
HAVING
AVG(amount) > 500 AND COUNT(order_id) >= 3;在这个例子中,我们同时使用了
AVG()
COUNT()
HAVING
AND
再来一个稍微复杂点的:找出那些总销售额超过10000,或者虽然总销售额没到10000但至少有100笔交易的商品。
SELECT
product_id,
SUM(sale_amount) AS total_sales,
COUNT(transaction_id) AS total_transactions
FROM
sales_records
GROUP BY
product_id
HAVING
SUM(sale_amount) > 10000 OR COUNT(transaction_id) >= 100;这种灵活性让
HAVING
HAVING
谈到优化,
HAVING
WHERE
HAVING
核心原则是:能用WHERE
HAVING
为什么这么说?因为
WHERE
GROUP BY
WHERE
举个例子:我们只想分析2023年的数据,并且找出总金额超过1000的客户。
低效的做法(尽量避免,如果条件可以下推到WHERE):
SELECT
customer_id,
SUM(amount) AS total_spent
FROM
orders
GROUP BY
customer_id
HAVING
SUM(amount) > 1000
AND MAX(order_date) >= '2023-01-01' -- 这里尝试用HAVING过滤年份,但效率不如WHERE
AND MIN(order_date) <= '2023-12-31';这里,
MAX(order_date)
MIN(order_date)
HAVING
WHERE
order_date
高效的做法:
SELECT
customer_id,
SUM(amount) AS total_spent
FROM
orders
WHERE
order_date BETWEEN '2023-01-01' AND '2023-12-31' -- 先在WHERE过滤年份
GROUP BY
customer_id
HAVING
SUM(amount) > 1000; -- 再在HAVING过滤聚合结果在这个高效的例子中,数据库引擎首先会根据
WHERE
GROUP BY
SUM()
当然,有些时候你别无选择,条件本身就依赖于聚合结果,那就必须使用
HAVING
GROUP BY
总的来说,
HAVING
WHERE
以上就是sql怎样使用having结合聚合函数筛选数据 sql聚合筛选与having用法的技巧的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号