Difference between EXISTS and IN in SQL?

exists, sql, sql-in

Solution

The `exists` keyword can be used in that way, but really it's intended as a way to avoid counting:

--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 ... )

This is most useful where you have `if` conditional statements, as `exists` can be a lot quicker than `count`.

The `in` is best used where you have a static list to pass:

 select * from [table]
 where [field] in (1, 2, 3)

When you have a table in an `in` statement it makes more sense to use a `join`, but mostly it shouldn't matter. The query optimiser should return the same plan either way. In some implementations (mostly older, such as Microsoft SQL Server 2000) `in` queries will always get a nested join plan, while `join` queries will use nested, merge or hash as appropriate. More modern implementations are smarter and can adjust the plan even when `in` is used.

Problem

What is the difference between the `EXISTS` and `IN` clause in SQL? When should we use `EXISTS`, and when should we use `IN`?

Original source