首页 > 解决方案 > HAVING 与子查询的效率以及原因

问题描述

当我学习 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

我想知道推荐哪一个以及为什么这个比另一个更快或更有效的原因。

标签: mysqlsql

解决方案


与任何性能问题一样,您应该在数据上进行尝试。但是,两者应该本质上是等价的。如果您对此类问题感兴趣,那么您应该学习如何阅读执行计划。

只是关于 MySQL 的一个注释。MySQL 倾向于实现子查询。通过在过滤结果之前编写结果,这可能会group by产生一些额外的开销,但您可能不会注意到差异。


推荐阅读