Mediumexists

Чем EXISTS от IN отличается?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

EXISTS проверяет, что подзапрос вернул хотя бы одну строку (останавливается на первом совпадении). IN проверяет вхождение значения в список/подзапрос.

-- EXISTS: коррелированный, ссылается на внешний запрос
SELECT * FROM users u
WHERE EXISTS (
  SELECT 1 FROM orders WHERE user_id = u.id
);

-- IN: подзапрос вычисляется один раз
SELECT * FROM users
WHERE id IN (SELECT user_id FROM orders);

Осторожно с NOT IN и NULL: NOT IN (1, 2, NULL) всегда даёт UNKNOWN и ничего не вернёт. Используйте NOT EXISTS или добавьте AND col IS NOT NULL. Современный оптимизатор (PostgreSQL, MySQL 8+) часто сам преобразует IN ↔ EXISTS, разницы в производительности почти нет.

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.