当我研究SQL HAVING教程时,它说:HAVING是筛选已聚合查询的“干净”方法,但是通常也可以使用子查询来完成。
有时,HAVING语句等效于子查询,如下所示:
select account_id, sum(total_amt_usd) as sum_amount
from demo.orders
group by account_id
having sum(total_amt_usd) >= 250000
select *
from (
select account_id, sum(total_amt_usd) as sum_amount
from demo.orders
group by account_id
) as subtable
where sum_amount >= 250000
我想知道推荐哪一种,以及为什么它比另一种更快或更有效的原因。
答案 0 :(得分:1)
与任何性能问题一样,您应该对数据进行尝试。但是,两者在本质上应该是等效的。如果您对此类问题感兴趣,则应该学习如何阅读执行计划。
关于MySQL的一点说明。 MySQL倾向于实现子查询。通过在过滤结果之前写入group by
结果,这可能会产生一些额外的开销,但是您可能不会注意到其中的区别。