SQL中EXISTS和IN的区别是什么?
EXISTS
可以告诉你查询是否返回任何结果,例如:
SELECT * FROM Orders o WHERE EXISTS ( SELECT * FROM Products p WHERE p.ProductNumber = o.ProductNumber)
IN
用于将一个值与多个值进行比较,可以使用字面值,如下所示:
SELECT * FROM Orders WHERE ProductNumber IN (1, 10, 100)
您也可以在 IN
子句中使用查询结果,如下所示:
SELECT * FROM Orders WHERE ProductNumber IN ( SELECT ProductNumber FROM Products WHERE ProductInventoryQuantity > 0)
exists
关键字可以这样使用,但实际上它的目的是为了避免计数:
--this statement needs to check the entire table select count(*) from [table] where ... --this statement is true as soon as one match is found exists ( select * from [table] where ... )
这在你有条件语句的时候非常有用,因为exists
比count
更快。
in
最好用在你有一个静态列表要传递的情况下:
select * from [table] where [field] in (1, 2, 3)
当你在in
语句中有一个表时,使用join
更有意义,但大多数情况下并不重要。查询优化器应该返回相同的计划。在某些实现中(主要是旧版本,如微软SQL Server 2000),in
查询总是会得到一个嵌套的连接计划,而join
查询会使用嵌套的,合并或哈希等适当的计划。更现代的实现更加智能,即使使用in
也可以调整计划。