Практика по JOIN

This commit is contained in:
mnoskov
2026-03-08 18:21:19 +03:00
parent 936be276bb
commit 221ca37da6
5 changed files with 188 additions and 0 deletions
@@ -0,0 +1,188 @@
-- Задание 1
SELECT
o.id AS order_id,
o.order_date,
o.status,
u.name AS user_name,
u.country
FROM
mnoskov.orders o
LEFT JOIN
mnoskov.users u ON o.user_id = u.id;
-- Логичнее начать с orders, тк надо вывести пользователей по заказам, а не наоборот.
-- Здесть уместнее LEFT, потому что в условии сказано ВСЕ заказы и уже по ним пользователей. Попробовал и INNER и LEFT - вывод один и тот же.
-- Задание 2
SELECT
oi.order_id,
p.name AS prouct_name,
oi.quantity,
oi.price_at_purchase
FROM
mnoskov.order_items oi
JOIN
mnoskov.products p ON oi.product_id = p.id
WHERE
oi.order_id = 1; -- если 101, как в условии то ничего не будет
-- Если фильтрацию поставить после ON, то выведутся все продукты по 2 раза, у всех id=1, quantity и price возьмутсы из двух строк в order_items где id=1.
-- Задание 3
SELECT
oi.order_id,
u.name AS user_name,
p.name AS product_name,
oi.quantity,
oi.price_at_purchase
FROM
mnoskov.order_items oi
JOIN
mnoskov.products p ON oi.product_id = p.id
JOIN
mnoskov.orders o ON oi.order_id = o.id
JOIN
mnoskov.users u ON o.user_id = u.id;
-- Заказ с id=3 повторяется два раза, потому что в заказе два товара, и они отображаются на двух строках.
-- Поскольку мы выводис все заказы, у нас больше строк по сравнению с заданием-2, и ещё мы выводим имена заказчиков.
--Задание 4
SELECT
u.name AS user_name,
o.id AS order_id,
o.status
FROM
mnoskov.users u
LEFT JOIN
mnoskov.orders o ON u.id = o.user_id;
-- Этот запрос отличается от INNER тем, что тут отображаются ещё и пользователи без заказов.
-- Задание 5
SELECT
u.id AS user_id,
u.name AS user_name
FROM
mnoskov.users u
LEFT JOIN
mnoskov.orders o ON u.id = o.user_id
WHERE
o.user_id IS NULL;
-- Важно фильтровать по колонке из orders, потому что она будет NULL из-за LEFT JOIN. Если есть несостыковки, то NULL будет в правой таблице после LEFT JOIN.
-- Задание 6
SELECT
oi.order_id,
u.id AS user_name,
p.name AS product_name,
oi.quantity
FROM
mnoskov.order_items oi
JOIN
mnoskov.products p ON oi.product_id = p.id
JOIN
mnoskov.orders o ON oi.order_id = o.id
JOIN
mnoskov.users u ON o.user_id = u.id
WHERE
p.name LIKE 'Kindle';
-- Заказ 2 встречается 1 раз, потому что там всего один товар, и потому что мы ищем именно товар с названием - Kindle.
-- Задание 7
SELECT
p.name AS product_name,
oi.order_id,
oi.quantity
FROM
mnoskov.products p
LEFT JOIN
mnoskov.order_items oi ON p.id = oi.product_id;
-- Если товар не покупали то в order_id будет NULL
-- Если использовать INNER, то выведутся только товары у которых есть заказы, в случае с LEFT выведутся все заказы.
-- Задание 8
SELECT
oi.order_id,
u.name AS user_name,
p.name AS product_name,
oi.quantity,
oi.price_at_purchase
FROM
mnoskov.order_items oi
JOIN
mnoskov.products p ON oi.product_id = p.id
JOIN
mnoskov.orders o ON oi.order_id = o.id
JOIN
mnoskov.users u ON o.user_id = u.id
WHERE
o.status = 'paid';
-- Если написать status = 'paid' после ON в orders, то ничего не поменяется, потому что после ON пишутся условия соединения таблиц также как и в WHERE, но как я понял лучше писать в WHERE.
-- Задание 9
SELECT
oi.order_id,
o.order_date,
p.name AS product_name,
oi.quantity,
oi.price_at_purchase
FROM
mnoskov.users u
JOIN
mnoskov.orders o ON u.id = o.user_id
JOIN
mnoskov.order_items oi ON o.id = oi.order_id
JOIN
mnoskov.order_items oi2 ON oi.product_id = oi2.product_id
JOIN
mnoskov.orders o2 ON oi2.order_id = o2.id
JOIN
mnoskov.products p ON oi2.product_id = p.id
WHERE
u.name = 'Alice';
-- Если у Alice не будет заказов то ничего не выведется.
-- Мы получается берем Alice -> идем до id товаров Alice -> идем обратно к заказам и выводим товары которые были у Alice.
-- Мне подсказала нейронка как использовать SELF JOIN - я понимал что он нужен, но не понимал как именно им воспользоваться.
-- Только после такого запроса я разобрался как это работает:
/*SELECT
oi.order_id,
o.order_date,
p.name AS product_name,
oi.quantity,
oi.price_at_purchase,
u2.name,
u2.id
FROM
mnoskov.users u
JOIN
mnoskov.orders o ON u.id = o.user_id
JOIN
mnoskov.order_items oi ON o.id = oi.order_id
JOIN
mnoskov.order_items oi2 ON oi.product_id = oi2.product_id
JOIN
mnoskov.orders o2 ON oi2.order_id = o2.id
JOIN
mnoskov.users u2 ON o2.user_id = u2.id
JOIN
mnoskov.products p ON oi2.product_id = p.id
WHERE
u.name = 'Alice';*/
-- Задание 10
SELECT
o.id AS order_id,
o.user_id,
o.status
FROM
mnoskov.orders o
LEFT JOIN
mnoskov.order_items oi ON o.id = oi.order_id;
-- Если написать INNER JOIN, то появятся только существующие заказы, которые есть в обеих таблицах.