homework, pet project DE Dmitry_Medvedev #1
@@ -0,0 +1,144 @@
|
||||
-- Задание 1
|
||||
SELECT o.id AS order_id,
|
||||
o.order_date,
|
||||
o.status,
|
||||
u.name AS user_name,
|
||||
u.country
|
||||
FROM orders o
|
||||
JOIN users u ON o.user_id = u.id;
|
||||
|
||||
-- Ответ на вопросы
|
||||
-- 1. Логичнее начать c orders, так как нам в первую очередь нужны все заказы,
|
||||
-- а потом только пользователи которые их сделали.
|
||||
|
||||
-- 2. Я думаю уместнее сделать LEFT.
|
||||
-- Я пробовал сделать с INNER и LEFT и у меня не пропали строки.
|
||||
-- Получается это из за того что у каждого заказа есть пользователь, не дуаю что должен создастся заказ без пользователя.
|
||||
|
||||
|
||||
-- Задание 2
|
||||
SELECT o.id AS order_id,
|
||||
p.name AS product_name,
|
||||
oi.quantity,
|
||||
oi.price_at_purchase
|
||||
FROM orders o
|
||||
JOIN order_items oi ON oi.order_id = o.id
|
||||
JOIN products p ON p.id = oi.product_id
|
||||
WHERE o.id = 101;
|
||||
|
||||
-- Ответ на вопрос
|
||||
-- Выдаст дублированный состав заказа с id 101,
|
||||
-- получается он будет обращаться к каждаму заказу, но отображать продукты заказа с id 101
|
||||
|
||||
|
||||
-- Задание 3
|
||||
SELECT o.id AS order_id,
|
||||
u.name AS name,
|
||||
p.name AS product_name,
|
||||
oi.quantity,
|
||||
oi.price_at_purchase
|
||||
FROM orders o
|
||||
JOIN users u ON u.id = o.user_id
|
||||
JOIN order_items oi ON oi.order_id = o.id
|
||||
JOIN products p ON p.id = oi.product_id;
|
||||
|
||||
-- Ответ на вопрос
|
||||
-- 1. Появляется дубликат заказов потому что у 3 заказа есть несколько товаров, join превращает(размножает) их в несколько строк.
|
||||
-- 2. Отличается тем что мы выводим все заказы с товарами а не один заказ.
|
||||
|
||||
|
||||
-- Задание 4
|
||||
SELECT u.name AS user_name,
|
||||
o.id AS order_id,
|
||||
o.status
|
||||
FROM users u
|
||||
LEFT JOIN orders o ON o.user_id = u.id;
|
||||
|
||||
-- Ответ на вопрос
|
||||
-- INNER JOIN не выдаст пользователей без заказа. Только тех у кого есть пара с orders.
|
||||
|
||||
|
||||
-- Задание 5
|
||||
SELECT u.id AS user_id,
|
||||
u.name AS user_name
|
||||
FROM users u
|
||||
LEFT JOIN orders o ON o.user_id = u.id
|
||||
WHERE o.id IS NULL;
|
||||
|
||||
-- Ответ на вопрос
|
||||
-- 1. Проверять IS NULL нужно по полю orders.id
|
||||
-- 2. Мы должны в запросе получить всех пользователей, а потом в фильтре "узнать" есть ли у них заказы.
|
||||
|
||||
|
||||
-- Задание 6
|
||||
SELECT o.id AS order_id,
|
||||
u.name AS user_name,
|
||||
p.name AS product_name,
|
||||
oi.quantity
|
||||
FROM orders o
|
||||
JOIN users u ON u.id = o.user_id
|
||||
JOIN order_items oi ON oi.order_id = o.id
|
||||
JOIN products p ON p.id = oi.product_id
|
||||
WHERE p.name ILIKE '%kindle%';
|
||||
|
||||
-- Ответ на вопрос
|
||||
-- В заказе 2 есть только один товар с названием Kindle.
|
||||
|
||||
|
||||
-- Задание 7
|
||||
SELECT p.name AS product_name,
|
||||
oi.order_id,
|
||||
oi.quantity
|
||||
FROM products p
|
||||
LEFT JOIN order_items oi ON oi.product_id = p.id;
|
||||
|
||||
-- Ответ на вопрос
|
||||
-- 1. order_id будет NULL
|
||||
-- 2. Если использовать INNER JOIN то он не покажет товар который не заказывали.
|
||||
|
||||
|
||||
-- Задание 8
|
||||
SELECT o.id AS order_id,
|
||||
u.name AS user_name,
|
||||
p.name AS product_name,
|
||||
oi.quantity,
|
||||
oi.price_at_purchase
|
||||
FROM products p
|
||||
JOIN order_items oi ON oi.product_id = p.id
|
||||
JOIN orders o ON o.id = oi.order_id
|
||||
JOIN users u ON u.id = o.user_id
|
||||
WHERE o.status = 'paid';
|
||||
|
||||
-- Ответ на вопрос
|
||||
-- У меня получился тот же результат если написать вот так - JOIN orders o ON o.id = oi.order_id and o.status = 'paid'
|
||||
|
||||
|
||||
-- Задание 9
|
||||
SELECT o.id AS order_id,
|
||||
o.order_date,
|
||||
p.name AS product_name,
|
||||
oi.quantity,
|
||||
oi.price_at_purchase
|
||||
FROM products p
|
||||
JOIN order_items oi ON oi.product_id = p.id
|
||||
JOIN orders o ON o.id = oi.order_id
|
||||
JOIN users u ON u.id = o.user_id
|
||||
WHERE u.name = 'Alice';
|
||||
|
||||
-- Ответ на вопрос
|
||||
-- Если у пользователя нет ни одного заказа, то этот запрос вернет пустую строку.
|
||||
-- Не вернет потому что нечего отобразить таблице, если нет заказов то и нет купленных товаров.
|
||||
-- Но если прописать RIGHT JOIN users u ON u.id = o.user_id то отобразит все строки NULL.
|
||||
|
||||
|
||||
-- Задание 10
|
||||
SELECT o.id AS order_id,
|
||||
o.user_id,
|
||||
o.status
|
||||
FROM orders o
|
||||
LEFT JOIN order_items oi ON oi.order_id = o.id
|
||||
WHERE oi.order_id IS NULL;
|
||||
|
||||
-- Ответ на вопрос
|
||||
-- Такой запрос выдаст пустые строки.
|
||||
-- INNER JOIN должен выдать строки только если есть "пара".
|
||||
Reference in New Issue
Block a user