Объединение данных
Что такое JOIN?
JOIN используется для объединения строк из двух или более таблиц на
основе связанного столбца между ними.
Какие существуют типы JOIN?
Виды JOIN:
-
INNER JOIN:- Возвращает только те строки, у которых есть соответствующие строки в обеих таблицах.
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id; -
LEFT JOIN(илиLEFT OUTER JOIN):- Возвращает все строки из левой таблицы и соответствующие строки из правой таблицы. Если нет соответствия, заполняет правые столбцы
NULL.
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id; - Возвращает все строки из левой таблицы и соответствующие строки из правой таблицы. Если нет соответствия, заполняет правые столбцы
-
RIGHT JOIN(илиRIGHT OUTER JOIN):- Возвращает все строки из правой таблицы и соответствующие строки из левой таблицы. Если нет соответствия, заполняет левые столбцы
NULL.
SELECT * FROM table1 RIGHT JOIN table2 ON table1.id = table2.id; - Возвращает все строки из правой таблицы и соответствующие строки из левой таблицы. Если нет соответствия, заполняет левые столбцы
-
FULL JOIN(илиFULL OUTER JOIN):- FULL JOIN возвращает все совпавшие пары, а также строки без пары с обеих сторон. Для отсутствующей стороны соответствующие столбцы заполняются NULL.
SELECT * FROM table1 FULL JOIN table2 ON table1.id = table2.id;
Пример:
SELECT employees.name, departments.name
FROM employees
INNER JOIN departments ON employees.department_id = departments.id;
Этот запрос соединяет таблицы employees и departments, возвращая только те строки, у которых есть соответствие по department_id.
Что лучше использовать JOIN или подзапросы?
JOIN
vs Подзапросы:
JOIN
-
Производительность зависит от плана, данных и индексов. Оптимизатор может превратить JOIN и подзапрос в одинаковый план; сравнивайте EXPLAIN ANALYZE, сохраняя семантику и число строк результата.
-
Читаемость: Легче читать и понимать при объединении данных из нескольких таблиц.
-
Использование: Предпочтителен для выборки данных из связанных таблиц.
Подзапросы
-
Коррелированный подзапрос иногда требует повторных вычислений, но СУБД может его преобразовать. Для проверки существования EXISTS часто точнее выражает задачу, чем JOIN, который может размножить строки.
-
Читаемость: Может быть более понятным для выполнения простых фильтраций.
-
Использование: Удобен для вложенных условий и вычислений, которые сложно выразить с помощью JOIN.
Рекомендации
-
Используйте
JOINдля объединения таблиц. -
Используйте подзапросы для фильтрации данных или когда логика сложнее выражается с помощью подзапросов.
Примеры:
JOIN
:
SELECT e.name, d.name
FROM employees e
JOIN departments d ON e.department_id = d.id;
Подзапрос
:
SELECT name
FROM employees
WHERE department_id IN (SELECT id FROM departments WHERE location = 'New York');