← Все вопросы
Чем WHERE id IN (подзапрос) отличается от обычного JOIN?
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.
Ваш ответ
Войдите, чтобы ответить на вопрос.