SQL中的EXISTS子句和IN子句有什么区别?
什么时候应该使用EXISTS,什么时候应该使用IN?
SQL中的EXISTS子句和IN子句有什么区别?
什么时候应该使用EXISTS,什么时候应该使用IN?
当前回答
EXISTS is much faster than IN when the subquery results is very large. IN is faster than EXISTS when the subquery results is very small. CREATE TABLE t1 (id INT, title VARCHAR(20), someIntCol INT) GO CREATE TABLE t2 (id INT, t1Id INT, someData VARCHAR(20)) GO INSERT INTO t1 SELECT 1, 'title 1', 5 UNION ALL SELECT 2, 'title 2', 5 UNION ALL SELECT 3, 'title 3', 5 UNION ALL SELECT 4, 'title 4', 5 UNION ALL SELECT null, 'title 5', 5 UNION ALL SELECT null, 'title 6', 5 INSERT INTO t2 SELECT 1, 1, 'data 1' UNION ALL SELECT 2, 1, 'data 2' UNION ALL SELECT 3, 2, 'data 3' UNION ALL SELECT 4, 3, 'data 4' UNION ALL SELECT 5, 3, 'data 5' UNION ALL SELECT 6, 3, 'data 6' UNION ALL SELECT 7, 4, 'data 7' UNION ALL SELECT 8, null, 'data 8' UNION ALL SELECT 9, 6, 'data 9' UNION ALL SELECT 10, 6, 'data 10' UNION ALL SELECT 11, 8, 'data 11' Query 1 SELECT FROM t1 WHERE not EXISTS (SELECT * FROM t2 WHERE t1.id = t2.t1id) Query 2 SELECT t1.* FROM t1 WHERE t1.id not in (SELECT t2.t1id FROM t2 ) If in t1 your id has null value then Query 1 will find them, but Query 2 cant find null parameters. I mean IN can't compare anything with null, so it has no result for null, but EXISTS can compare everything with null.
其他回答
Exists关键字计算true或false,而IN关键字比较相应子查询列中的所有值。 另一个Select 1可与Exists命令一起使用。例子:
SELECT * FROM Temp1 where exists(select 1 from Temp2 where conditions...)
但IN的效率较低,所以存在更快。
我认为,
EXISTS是当您需要将查询结果与另一个子查询匹配时。 查询#1的结果需要在SubQuery结果匹配的地方检索。有点像Join.. 例如,选择表1中也下过表2订单的客户 IN用于检索特定列的值是否位于列表(1,2,3,4,5)中 例如,选择位于以下邮政编码中的客户,即zip_code值位于(....)列表中。
什么时候使用一种而不是另一种……当你觉得读起来合适的时候(更好地传达意图)。
如果使用IN操作符,SQL引擎将扫描从内部查询中获取的所有记录。另一方面,如果我们使用EXISTS, SQL引擎将在找到匹配项后立即停止扫描过程。
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 ... )
这是最有用的if条件语句,as exists可以比count快得多。
in最好用在你有一个静态列表要传递的地方:
select * from [table]
where [field] in (1, 2, 3)
当在in语句中有一个表时,使用连接更有意义,但大多数情况下这并不重要。无论哪种方式,查询优化器都应该返回相同的计划。在一些实现中(大多数是旧的,如Microsoft SQL Server 2000),查询将总是获得嵌套的连接计划,而连接查询将适当地使用嵌套、合并或散列。更现代的实现更智能,甚至可以在使用in时调整计划。
哪个更快取决于内部查询获取的查询数量:
当您的内部查询获取数千行,那么EXIST将是更好的选择 当您的内部查询获取少量行时,那么IN将更快
EXIST对true或false进行评估,但在比较多个值。当你不知道记录是否存在时,你应该选择exist