SQL中EXISTS和IN的区别?

SQL中的EXISTSIN子句有什么区别? 性能

咱们什么时候应该使用EXISTS ,什么时候应该使用INspa


#1楼

Exists关键字计算true或false,但IN关键字比较相应子查询列中的全部值。 另外一个Select 1能够与Exists命令一块儿使用。 例: code

SELECT * FROM Temp1 where exists(select 1 from Temp2 where conditions...)

IN效率较低,所以Exists速度更快。 it


#2楼

若是您使用的是IN运算符,则SQL引擎将扫描从内部查询中提取的全部记录。 另外一方面,若是咱们使用EXISTS,SQL引擎会在找到匹配后当即中止扫描过程。 io


#3楼

  1. 当子查询结果很是大时, EXISTSIN快得多。
    当子查询结果很是小时, INEXISTS快。 效率

    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'
  2. 查询1 select

    SELECT FROM t1 WHERE not EXISTS (SELECT * FROM t2 WHERE t1.id = t2.t1id)

    查询2 查询

    SELECT t1.* FROM t1 WHERE t1.id not in (SELECT t2.t1id FROM t2 )

    若是在t1你的id有空值,那么查询1将找到它们,可是查询2没法找到空参数。 di

    个人意思是IN没法与null进行比较,所以它没有null的结果,可是EXISTS能够将全部内容与null进行比较。 co


#4楼

若是子查询返回多个值,则可能须要执行外部查询 - 若是条件中指定的列中的值与子查询的结果集中的任何值匹配。 要执行此任务,您须要使用in关键字。

您能够使用子查询来检查是否存在一组记录。 为此,您须要将exists子句与子查询一块儿使用。 exists关键字始终返回true或false值。


#5楼

EXISTS的性能比IN快。 若是大多数过滤条件都在子查询中,那么最好使用IN,若是大多数过滤条件都在主查询中,那么最好使用EXISTS。

相关文章
相关标签/搜索