-- Задание 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, то появятся только существующие заказы, которые есть в обеих таблицах.