Короткий ответ
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);