сделал DDL для пет проекта
This commit is contained in:
@@ -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 product_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_id,
|
||||
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, то появятся только существующие заказы, которые есть в обеих таблицах.
|
||||
Reference in New Issue
Block a user