SQL

EXISTS vs IN — Subquery Filtering

admin by @admin ADMIN
1h ago
May 31, 2026
Public
0 0 up · 0 down Sign in to vote
Both check membership. `EXISTS` is usually faster for big subqueries (stops at first hit). `IN` is more readable for small fixed lists. `NOT IN` is dangerous with NULLs — prefer `NOT EXISTS`.
SQL
Raw
-- IN with a fixed list
SELECT * FROM orders WHERE status IN ('pending', 'shipped');

-- IN with a subquery
SELECT * FROM users
WHERE  id IN (SELECT user_id FROM orders WHERE amount > 1000);

-- EXISTS — usually faster on large subqueries
SELECT * FROM users u
WHERE  EXISTS (
  SELECT 1 FROM orders o
  WHERE  o.user_id = u.id AND o.amount > 1000
);

-- ⚠️ NOT IN is BROKEN with NULL — if any subquery row is NULL, you get NO rows.
-- Use NOT EXISTS instead:
SELECT * FROM users u
WHERE  NOT EXISTS (
  SELECT 1 FROM orders o WHERE o.user_id = u.id
);   -- users with zero orders, NULL-safe
Tags

Save your own code snippets

Create a free account and build your private vault. Share publicly whenever you want.