Существуют несколько видов соединений таблиц:
INNER JOIN или просто JOIN — внутреннее соединение. В результате остаются только те строки, для которых нашлось соответствие. До сих пор мы использовали только этот тип соединений.
LEFT JOIN — левое внешнее соединение. Работает как JOIN, но если для строки таблицы, находящейся по левую сторону ключевого слова LEFT JOIN, не нашлось ни одной строки в таблице, находящейся по правую сторону LEFT JOIN, то строка все равно добавляется в результат, а значения столбцов правой таблицы равны null.
RIGHT JOIN — правое внешнее соединение. Работает как JOIN, но если для строки таблицы, находящейся по правую сторону ключевого слова RIGHT JOIN, не нашлось ни одной строки в таблице, находящейся по левую сторону RIGHT JOIN, то строка все равно добавляется в результат, а значения столбцов левой таблицы равны null.
CROSS JOIN — перекрестное (или декартово) произведение. Каждая строка одной таблицы соединяется с каждой строкой второй таблицы, давая тем самым в результате все возможные сочетания строк двух таблиц. Аналогичного результата можно достичь просто перечислив таблицы в FROM через запятую.
Соединение таблиц с помощью INNER JOIN / JOIN
INNER JOIN – это операция в SQL для объединения двух или более таблиц на основе условия совпадения значений в общих столбцах, в результате чего в итоговом наборе данных остаются только те строки, которые имеют соответствия в обеих исходных таблицах. Этот тип объединения является самым распространенным и применяется для извлечения данных, связанных через общие ключи, таких как, например, сотрудники и их отделы.
Пример. Выберем записи из таблиц product и category, где поле cat_id равно полю id таблицы категории, а также код категории равен phones.
SELECT * FROM product INNER JOIN category ON product.cat_id = category.id WHERE category.code = 'phones';
Получаем все пользователей у которых есть хотя бы один заказ.
SELECT * FROM user INNER JOIN order ON user.id = order.user_id;
Получаем список всех пользователей, которые купили определённый товар
SELECT user.* FROM user INNER JOIN order ON user.id = order.user_id INNER JOIN product ON order.product_id = product.id WHERE product.title = 'Продукт 4';
Соединение таблиц с помощью LEFT JOIN / LEFT OUTER JOIN
В данном случае важен порядок таблиц. Выбираем все записи из таблицы product (левая таблица) а также их соответствия из таблицы category (правая таблица).
SELECT * FROM product LEFT JOIN category ON product.cat_id = category.id;
В случае если в таблицы category не будут найдены записи с соответствующим id, тогда в списке будет значения NULL у соответствующих полей.
Теперь попробуем сделать обратную выборку. Выберем все записи из таблицы product и category у которых связь по полю product.cat_id.
SELECT * FROM category LEFT JOIN product ON product.cat_id = category.id WHERE product.cat_id IS NOT NULL;
Соединение таблиц с помощью RIGHT JOIN / RIGHT OUTER JOIN
RIGHT JOIN указывает ведущую таблицу наоборот в отличии от LEFT JOIN.
Давайте укажем RIGHT JOIN аналогично примеру выше. В данном случае правая таблица будет опорной для выборки, т.е. записи в таблице product без наличия связанной записи в таблице category выводится не будут.
SELECT * FROM product RIGHT JOIN category ON product.cat_id = category.id;
Соединение таблиц с помощью CROSS JOIN
Полное декартовое соединение таблиц. Говоря простым языком данный способ позволяет вывести список записей из нескольких таким образом, что к каждой уникальной записи левой таблицы будет сопоставлены все записи правой таблицы. Таким образом одна запись левой таблицы будет повторяться столько сколько есть записей в правой таблице.
SELECT * FROM product CROSS JOIN category;
Получиться то же самое что и
SELECT * FROM product, category;
Оператор UNION в SQL используется для объединения результатов двух или более запросов SELECT в один результирующий набор, удаляя дубликаты строк. Важно, чтобы все запросы, используемые с UNION, возвращали одинаковое количество столбцов, и соответствующие столбцы имели совместимые типы данных. Оператор UNION ALL объединяет результаты без удаления дубликатов, что делает его быстрее.
SELECT product.* FROM product LEFT JOIN category ON product.cat_id = category.id UNION SELECT product.* FROM product LEFT JOIN category ON product.cat_id = category.id WHERE product.id > 3;