MySQL中能否用HAVING子句替代WHERE过滤id这类列?
MySQL中HAVING子句替代WHERE的场景说明
你提到的SELECT * FROM emp1 HAVING id = 1;确实能实现和WHERE id = 1相同的效果,但这属于非规范用法,原因如下:
- 当SQL中没有指定
GROUP BY子句时,MySQL会默认将整个表的数据视为单个分组,此时HAVING子句相当于对这个单分组的结果进行过滤,功能上和WHERE一致。 - HAVING的设计初衷是配合
GROUP BY,用来过滤经过聚合函数计算后的分组结果。直接用它替代WHERE会降低SQL的可读性,其他开发者看到这类写法时可能会困惑你的业务意图。 - 性能层面,WHERE是在数据检索的早期阶段过滤不符合条件的行,能减少后续需要处理的数据量;而HAVING是在结果集生成后再做过滤,对于数据量较大的表,WHERE的执行效率通常更高。
两种写法对比:
规范写法(推荐):
SELECT * FROM emp1 WHERE id = 1;
你的测试写法:
SELECT * FROM emp1 HAVING id = 1;
内容的提问来源于stack exchange,提问作者Shreya Patil
相关产品推荐
相关产品推荐

