Короткий ответ
JOIN — операция объединения строк двух или более таблиц на основе условия соответствия, обычно по ключам. INNER JOIN возвращает только совпавшие строки; LEFT JOIN — все строки левой таблицы, а при отсутствии совпадения поля правой заполняются NULL; RIGHT JOIN — зеркальный вариант для правой таблицы; FULL JOIN возвращает все строки обеих таблиц, заполняя NULL стороны без пары.
Как это работает подробнее
Подзапрос (subquery) — это запрос, вложенный в другой запрос: он используется в WHERE через IN, EXISTS или сравнение со значением, а также в списке выборки для фильтрации и вычислений. Главное отличие от JOIN — в результате: JOIN «расширяет» выборку колонками второй таблицы, а подзапрос вычисляет отдельный результат, который внешний запрос использует как условие или источник данных.
- Объём результата: INNER JOIN — пересечение; LEFT и RIGHT JOIN — все строки одной стороны с NULL на другой; FULL JOIN — все строки обеих таблиц.
- Подзапрос: коррелированный подзапрос выполняется для каждой строки внешнего запроса и на больших объёмах может работать медленнее, чем JOIN.
- Практическое правило: нужно объединить данные нескольких таблиц в одном результате — выбирайте JOIN; нужно отфильтровать строки по вычисленному значению (например, «зарплата выше средней по отделу») — подзапрос или
EXISTS. - Производительность: JOIN обычно предпочтительнее, когда без него не обойтись для получения колонок связанных таблиц.
Пример кода
SELECT e.name, d.name AS department
FROM employees e
LEFT JOIN departments d ON e.department_id = d.id;
-- подзапрос: фильтрация по вычисленному значению
SELECT name
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);Что использовать на практике
- Для объединения таблиц в одном результате используйте JOIN — это предпочтительнее и по производительности.
- Подзапросы применяйте для фильтрации по агрегированным или вычисленным значениям.
- Для проверки наличия строк в связанной таблице часто эффективнее
EXISTS, чем подзапрос сIN.
Подводные камни
- Пропущенное условие ON даёт декартово произведение строк — результат может разрастись катастрофически.
- LEFT JOIN легко «превращается» в INNER JOIN по смыслу, если в WHERE отфильтровать NULL из правой таблицы.
- Коррелированные подзапросы на больших таблицах могут работать заметно медленнее аналога на JOIN.
Как отвечать на собеседовании
- Дайте определение JOIN как объединения строк по условию → последовательно разберите INNER, LEFT, RIGHT, FULL с акцентом на строки без пары и NULL → приведите короткий пример → перейдите к определению подзапроса → сравните по механике: JOIN расширяет колонками, подзапрос даёт отдельный результат → добавьте практическое правило выбора.