Add homework for JOIN
This commit is contained in:
@@ -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