SQL | Joins / Объединение таблицы
Джоины / JOINS - залупа для объединения значений из двух или нескольких таблиц. Нихуя наверное не поняли, поэтому давайте на примере посмотрим, но сначала небольшой тизер. Объединение таблиц осуществляется на основе ссылочного ключа от одной таблицы к другой. Например, давай извлечем товары и категории, где у товара существует ссылочный ключ на категорию. Тут используются псевдонимы AS для сокращения длины
SELECT
берем название товара, цену и название категории, затем джоиним всё с категорий, где две эти таблицы связаны между собой ключами (INNER JOIN - внутреннее - связывание).
Теперь давай ебанем сложный запрос, где несколько связанных таблиц и надо найти все покупки конкретного юзера
SELECT
2. Затем, снова связываем полученный результат уже с таблицей orders (заказы)
3. На основе полученных данных мы фильтруем заказы по указанному идшнику юзера
Данных запросов можно еще сильнее усложнить подзапросами, группировкой, фильтрацией и лимитом. Полезно для мониторинга бывает. Напримере вывода общего количество заказов пользователя и тд
Теперь про типы джоинов (объединений). Есть внешние и внутренние
INNER JOIN - внутренне объединение (вывод элементов, ссылочное поле = поле связываемой таблицей). Выводит результат, где у обеих таблиц есть данные. Например онлайн-школа, у категории 'Вебинар' может не быть товара, как и у товара категории. В таком случае вывод этих значений внутренним объединением невозможно, для есть существуют внешние объединения
OUTER JOIN - внешнее объединение:
RIGHT OUTER JOIN - вывод всех элементов с правой таблицы, если даже не нашлось значений (например вывод всех товаров, даже если у них нет категорий)
LEFT OUTER JOIN - наоборот (вывод всех категорий, даже если у них нет товара)
ps: Либо справа, либо слева (в зависимости от типа связывания) будет пустое поле.
FULL JOIN (на похуй выводит всё. Есть/Нет данных - ваще поебать ему. Юзается оч редко)
CROSS JOIN - тож бесполезная хуйня (перекрестное скрещивание результатов, редко или вовсе не юзается)
Джоины / 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 - тож бесполезная хуйня (перекрестное скрещивание результатов, редко или вовсе не юзается)