2013-02-19 190 views
1

sub1和sub2都与super有1对1的关系。ISNULL()使用LEFT JOIN时,IS NULL性能

我想确定一个给定的超级记录是否存在一个连接。

以下两个查询应该产生我想要的结果。是否有任何理由使用!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; 
+1

[Mysql中的“IS NULL”和“ISNULL()”之间的差异的可能重复](http://stackoverflow.com/questions/3530124/differences-between-is-null-and-isnull-in-mysql ) – 2013-02-19 13:34:47

+1

我会说'不是NULL'更容易阅读。 – 2013-02-19 13:40:16

回答

1

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

+0

谢谢。你是否因为“查询优化器”而提出你的建议?这个查询优化器是什么?它是如何应用的? – user1032531 2013-02-19 13:43:15

+0

http://dev.mysql.com/doc/refman/5.5/en/optimization.html – 2013-02-20 02:17:24