如果我们在SELECT
中有一个IF EXISTS
语句,那么一旦在表中找到记录就会停止执行吗?例如:
IF EXISTS(SELECT * FROM table1 WHERE Name='John' )
return 1
else
return 0
如果表中存在名为= John的行,它是否会停止执行并返回1或者是否遍历整个表以查找更多匹配项?
是的它会停止执行所以这通常比HAVING COUNT(*) > 0
更好,而这通常不会。
使用EXISTS
,如果查看执行计划,您将看到table1
的实际行数不会超过1,无论匹配记录的数量如何。
在某些情况下,SQL Server可以在简化阶段将COUNT
查询的树转换为与EXISTS
相同的树(具有半连接且看不到聚合运算符)an example of that is discussed in the comments here。
对于比问题中显示的更复杂的子树,您可能偶尔会发现COUNT
比EXISTS
表现更好。因为半连接只需要从子树中检索一行,所以这可以鼓励对树的那一部分使用嵌套循环的计划 - 这在实践中可能无法达到最佳效果。
在这种情况下,不需要“else”:
IF EXISTS(SELECT * FROM table1 WHERE Name='John' ) return 1
return 0