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