From 6540b576d2b3d9ea4ab6eec8fef5a1a4b89b3578 Mon Sep 17 00:00:00 2001 From: Dmitry Medvedev Date: Tue, 26 May 2026 01:08:47 +0500 Subject: [PATCH] added 10 tasks with joins --- dmedvedev/joins. sql | 209 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 209 insertions(+) create mode 100644 dmedvedev/joins. sql diff --git a/dmedvedev/joins. sql b/dmedvedev/joins. sql new file mode 100644 index 0000000..7807e41 --- /dev/null +++ b/dmedvedev/joins. sql @@ -0,0 +1,209 @@ +-- task 1 +--✅ Задача: покажи все заказы и информацию о пользователе, который их сделал. + +SELECT + o.id AS order_id, + o.order_date AS order_date, + o.status AS status, + u.name AS user_name, + u.country AS country +FROM orders o +INNER JOIN users u ON u.id = o.user_id; + +SELECT + o.id AS order_id, + o.order_date AS order_date, + o.status AS status, + u.name AS user_name, + u.country AS country +FROM orders o +LEFT JOIN users u ON u.id = o.user_id; + + +/* - С какой таблицы логичнее начать: `orders` или `users`? Почему? +Логичнее начать с orders потому что мы сразу отсекаем пользователей, которые не делали заказ. + +Написал в обоих, INNER JOIN покажет только те заказы, у которых есть пользователи. А LEFT JOIN покажет все заказы, даже там где нет пользователя. +- Какой тип JOIN здесь уместнее: `INNER` или `LEFT? Напиши запрос в обоих вариантах и посмотри, где пропадут строки. + */ + + +-- task 2 +--✅ Задача: покажи состав заказа 101 (что в нём купили). + +SELECT + o.id AS order_id, + p.name AS product_name, + oi.quantity AS quantity, + oi.price_at_purchase AS price_at_purchase +FROM order_items oi +INNER JOIN orders o ON o.id = oi.order_id +INNER JOIN products p ON p.id = oi.product_id +WHERE order_id = 101; + +/* +Что изменится, если эту фильтрацию order_id = 101 перенести в JOIN (после ON)? + +как я понял, в таком случае , заказ 101 привязывается ко всем товарам потому +что таблицы не соединены между собой +*/ + +--task 3 +--✅ Задача: выведи все заказы и товары внутри заказов (как “чек по магазину”). + +SELECT + o.id AS order_id, + u.name AS user_name, + p.name AS product_name, + oi.quantity AS quantity, + oi.price_at_purchase AS price_at_purchase +FROM orders o +INNER JOIN order_items oi ON o.id = oi.order_id +INNER JOIN products p ON oi.product_id = p.id +INNER JOIN users u ON u.id = o.user_id; + +/***❓ Ответь на вопросы:** + +- почему после JOIN заказ `3` появляется в нескольких строках; +потому что внутри заказа 3 несколько позиций товаров + +- чем результат отличается от задания 2 (по количеству строк и информации). +во второй задаче нужно было вывести информацию только по 101 заказу, здесь по всем. +и плюс указали кто купил и какое количество товаров +*/ + +--task 4 +--✅ Задача: вывести список всех пользователей и их заказы. +SELECT + u.name AS user_name, + o.id AS order_id, + o.status AS status +FROM users u +FULL JOIN orders o ON o.user_id = u.id; + +/* +**✅ После выполнения:** +Найди глазами пользователя без заказов (у него **`order_id`** будет **`NULL`**); +Таких имен найдено 3 штуки + +Чем этот запрос отличается от такого же, но с **`INNER JOIN`**? +Иннер джоин в таком случае бы просто удалил из выдачи данные с NULL, +то есть показал бы только пользователей с заказами, а остальных бы скрыл +*/ + +--task 5 +--✅ Задача: найти пользователей, у которых нет ни одного заказа. + +SELECT + o.user_id AS user_id, + u.name AS user_name +FROM orders o +FULL JOIN users u ON o.user_id = u.id +WHERE user_id IS NULL; + +/* **❓ Ответь на вопросы:** +Почему тут важно фильтровать именно по колонке из **`orders`**, а не из **`users`**? + +Фильтровать нужно по orders потому что в принципе в системе есть люди, +которые имеют и не имеют заказы, соответственно при выдаче запроса мы увидим , +что некоторые пользователи не имеют заказов, поэтому и фильтруем по заказам, +чтобы получить имена +*/ + +--task 6 +--✅ Задача: найти все заказы, где встречается товар Kindle. + +SELECT + oi.order_id AS order_id, + u.name AS user_name, + p.name AS product_name, + oi.quantity AS quantity +FROM order_items oi +FULL JOIN orders o ON o.id = oi.order_id +FULL JOIN users u ON o.user_id = u.id +FULL JOIN products p ON p.id = oi.product_id +WHERE p.name = 'Kindle'; + +/*Ответь на вопросы:** +- Почему заказ `2` встречается в выдаче один раз? + +Потому что внутри 2го заказа только 1 товар +*/ + +--task 7 +--✅ Задача: вывести все товары и информацию о том, в каких заказах они +--встречаются (если товар не покупали — тоже показать). + +SELECT + p.name AS product_name, + oi.order_id AS order_id, + oi.quantity AS quantity +FROM order_items oi +FULL JOIN orders o ON o.id = oi.order_id +FULL JOIN products p ON p.id = oi.product_id + +/*❓ Ответь на вопросы: +что будет в order_id, если товар ни разу не покупали? +- в order_id будет NULL если товар ни разу не покупали + +чем это отличается от варианта, если использовать INNER JOIN? +если использовать иннер, то в таком случае мы могли бы потерять из выборки +те заказы, которые не покупали */ + +--task 8 +SELECT + oi.order_id AS order_id, + u.name AS user_name, + p.name AS product_name, + oi.quantity AS quantity, + oi.price_at_purchase AS price_at_purchase +FROM order_items oi +FULL JOIN orders o ON o.id = oi.order_id +FULL JOIN products p ON p.id = oi.product_id +FULL JOIN users u ON u.id = o.user_id +WHERE o.status = 'paid'; + +/**❓ Ответь на вопросы:** +- что будет, если условие **`status = 'paid'`** написать в **`JOIN`** с **`orders`** (там же, где **`ON`**)? Изменится ли результат сейчас и почему? + +В таком случае все задублируется +*/ + +--task 9 +--Задание 9: Заказы пользователя Alice (все товары внутри) + +SELECT + oi.order_id AS order_id, + o.order_date AS order_date, + p.name AS product_name, + oi.quantity AS quantity, + oi.price_at_purchase AS price_at_purchase +FROM order_items oi +FULL JOIN orders o ON o.id = oi.order_id +FULL JOIN products p ON p.id = oi.product_id +FULL JOIN users u ON u.id = o.user_id +WHERE u.name = 'Alice'; + +/**❓ Ответь на вопросы:** +- если у Alice нет ни одного заказа, сколько строк вернёт твой запрос и почему? +В таком случае вернет 0 строк.*/ + +--task 10 +--Задание 10: Заказы без товаров (проверка целостности) + +SELECT + oi.order_id AS order_id, + o.user_id AS user_id, + o.status AS status, + u.name AS name +FROM order_items oi +FULL JOIN orders o ON o.id = oi.order_id +FULL JOIN products p ON p.id = oi.product_id +FULL JOIN users u ON u.id = o.user_id; + +/* +**❓ Ответь на вопросы:** +- Что будет, если вместо **`LEFT JOIN`** написать **`INNER JOIN`** — изменится ли результат и как. + +В таком случае, пропаду пустые строки +*/ \ No newline at end of file