added 10 tasks with joins

This commit is contained in:
Dmitry Medvedev
2026-05-26 01:08:47 +05:00
parent 9082197c80
commit 6540b576d2
+209
View File
@@ -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`** — изменится ли результат и как.
В таком случае, пропаду пустые строки
*/