Files
2026-05-21 00:56:45 +03:00

145 lines
5.0 KiB
SQL

-- Задание 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 должен выдать строки только если есть "пара".