在LEFT JOIN中嵌套INNER JOIN:哪种写法性能与编码风格更优?
在LEFT JOIN中嵌套INNER JOIN:性能与编码风格对比
当需要在LEFT JOIN里嵌套INNER JOIN时,下面两种写法哪种在性能和编码风格上更出色?
写法一:直接嵌套JOIN
SELECT demo.id AS demoId, demo2.ID AS demo2Id, demo3.ID AS demo3Id FROM demo LEFT JOIN (demo2 INNER JOIN demo3 ON demo3.ID = demo2.ID) ON demo2.ID = demo.ID
写法二:子查询别名化
SELECT demo.id AS demoId, demo23.ID AS demo23Id FROM demo LEFT JOIN ( SELECT demo2.ID FROM demo2 INNER JOIN demo3 ON demo3.ID = demo2.ID) AS demo23 ON demo.ID = demo23.ID
性能层面
大部分现代数据库的查询优化器(比如MySQL、PostgreSQL、SQL Server)会把这两种写法优化成完全一致的执行计划——毕竟它们表达的是同一个逻辑:先让demo2和demo3做INNER JOIN,再把这个结果和demo做LEFT JOIN。
唯一可能的差异:如果写法一要返回demo2和demo3的多个字段,而写法二只返回demo2的ID,那写法二的子查询因为返回字段更少,可能在数据传输或临时表存储上略占一点优势,但如果两者返回的字段完全一致,性能就没区别。
编码风格层面
- 写法一:代码更紧凑,少了一层子查询包裹,能直接体现JOIN的嵌套关系,但如果嵌套层级变多,括号堆在一起很容易让结构混乱,可读性直线下降。
- 写法二:通过给子查询起别名(demo23)明确了中间结果的含义,结构更清晰。尤其是当中间查询逻辑复杂(比如加过滤条件、聚合),或者后续需要复用这个逻辑时,可读性和可维护性都更强。而且写法二扩展起来更方便,不容易出错。
总结
- 如果只是简单的两层嵌套,且需要返回多个关联表的字段,两种写法性能没差,看个人习惯选就行;
- 如果中间逻辑复杂、需要明确中间结果的语义,或者之后可能要扩展查询,优先选写法二,它的可读性和可维护性更靠谱;
- 要是就喜欢代码紧凑且逻辑简单,写法一也能用,但别嵌套太深,不然自己看了都头疼。
内容的提问来源于stack exchange,提问作者Makc
相关产品推荐
相关产品推荐

