SQL | Joins / Объединение таблицы



Джоины
/ JOINS - залупа для объединения значений из двух или нескольких таблиц. Нихуя наверное не поняли, поэтому давайте на примере посмотрим, но сначала небольшой тизер. Объединение таблиц осуществляется на основе ссылочного ключа от одной таблицы к другой. Например, давай извлечем товары и категории, где у товара существует ссылочный ключ на категорию. Тут используются псевдонимы AS для сокращения длины



SELECT p.title, p.price, c.title FROM products AS p INNER JOIN category AS c ON p.category = c.id

берем название товара, цену и название категории, затем джоиним всё с категорий, где две эти таблицы связаны между собой ключами (INNER JOIN - внутреннее - связывание).



Теперь давай ебанем сложный запрос, где несколько связанных таблиц и надо найти все покупки конкретного юзера



SELECT p.id, p.name, p.price, s.quantity, p.price * s.quantity AS total FROM products AS p JOIN sales AS s ON p.id = s.product_id JOIN orders AS o ON o.id = s.order_id WHERE o.customer_id = 1

1. Связываем данные внутренним объединением с таблицей sales (продажи)

2. Затем, снова связываем полученный результат уже с таблицей orders (заказы)

3. На основе полученных данных мы фильтруем заказы по указанному идшнику юзера



Данных запросов можно еще сильнее усложнить подзапросами, группировкой, фильтрацией и лимитом. Полезно для мониторинга бывает. Напримере вывода общего количество заказов пользователя и тд





Теперь про типы джоинов (объединений). Есть внешние и внутренние



INNER JOIN - внутренне объединение (вывод элементов, ссылочное поле = поле связываемой таблицей). Выводит результат, где у обеих таблиц есть данные. Например онлайн-школа, у категории 'Вебинар' может не быть товара, как и у товара категории. В таком случае вывод этих значений внутренним объединением невозможно, для есть существуют внешние объединения



OUTER JOIN - внешнее объединение:

RIGHT OUTER JOIN - вывод всех элементов с правой таблицы, если даже не нашлось значений (например вывод всех товаров, даже если у них нет категорий)

LEFT OUTER JOIN - наоборот (вывод всех категорий, даже если у них нет товара)

ps: Либо справа, либо слева (в зависимости от типа связывания) будет пустое поле.



FULL JOIN (на похуй выводит всё. Есть/Нет данных - ваще поебать ему. Юзается оч редко)



CROSS JOIN - тож бесполезная хуйня (перекрестное скрещивание результатов, редко или вовсе не юзается)