← Все вопросы

Чем WHERE id IN (подзапрос) отличается от обычного JOIN?

Задан 4 месяца назад613 просмотров3 ответа
13

Хочу выбрать пользователей, у которых есть заказы. Можно через WHERE id IN (SELECT user_id FROM orders), а можно через JOIN orders. Оба работают. В чём практическая разница и что выбрать?

3 ответа

25

Главное отличие — что попадает в результат:

  • JOIN подмешивает в выборку колонки из второй таблицы и МНОЖИТ строки: если у юзера 5 заказов, он появится 5 раз. Чтобы получить уникальных, придётся добавлять DISTINCT.
  • WHERE user_id IN (подзапрос) (или EXISTS) — это просто фильтр «есть совпадение / нет». Строки users не дублируются, и колонки заказов в результат не попадают.

Правило: нужны данные из второй таблицы — JOIN. Нужна только проверка «существует ли связь» — IN/EXISTS. По скорости на нормальной БД с индексами они часто почти равны, планировщик нередко сводит их к одному плану.

10

Ещё про NULL: NOT IN (подзапрос со списком, где есть NULL) коварен — вернёт пустоту. NOT EXISTS и анти-JOIN этим не страдают. Для «нет связи» лучше избегать NOT IN.

5

Нужны колонки — JOIN, нужна проверка — IN/EXISTS.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект