使用 LEFT JOIN 时的 ISNULL() 与 ISNULL 性能

Posted

技术标签:

【中文标题】使用 LEFT JOIN 时的 ISNULL() 与 ISNULL 性能【英文标题】:ISNULL() verse IS NULL performance when using LEFT JOINs 【发布时间】:2013-02-19 13:29:39 【问题描述】:

sub1 和 sub2 都与 super 是一对一的关系。

我希望确定其中任何一个对于给定超级记录是否存在连接。

以下两个查询应该会产生我想要的结果。是否有任何理由使用 !ISNULL() 与 IS NOT NULL?

SELECT super.*
FROM super
LEFT OUTER JOIN sub1 ON super.id=sub1.super_id
LEFT OUTER JOIN sub2 ON super.id=sub2.super_id
WHERE (!ISNULL(sub1.id) OR !ISNULL(sub2.id)) AND super.id=123;

SELECT super.*
FROM super
LEFT OUTER JOIN sub1 ON super.id=sub1.super_id
LEFT OUTER JOIN sub2 ON super.id=sub2.super_id
WHERE (sub1.id IS NOT NULL OR sub2.id IS NOT NULL) AND super.id=123;

【问题讨论】:

Differences between "IS NULL" and "ISNULL()" in mysql的可能重复 我会说IS NOT NULL 更容易阅读。 【参考方案1】:

使用您的第二个选项 (IS NOT NULL)。查询优化器可能会也可能不会帮助您提高第二个查询的效率。但是查询优化器不执行任何功能。它假定它必须评估您为所有可能的行和列提供的任何函数;它不会尝试推断函数的含义。

【讨论】:

谢谢。您是否因为“查询优化器”而提出建议?这个查询优化器是什么以及它是如何应用的?

以上是关于使用 LEFT JOIN 时的 ISNULL() 与 ISNULL 性能的主要内容,如果未能解决你的问题,请参考以下文章

嵌套 CONCAT 中的 LEFT JOIN 和 IS NULL 仅返回 NULL

SQL left join 数据重复

SQL Server-聚焦NOT IN VS NOT EXISTS VS LEFT JOIN...IS NULL性能分析(十八)

MYSQL多表查询问题,left join的使用问题求教

Transact-SQLSQL Server自动把left join自动转化为inner join以及关联时的数据重复问题

mysql left join的深入探讨