← К оглавлению занятия

Занятие 24. Summary session 6

📁 Блок: SQL / MySQL / Связи и JOIN ⏱️ Время изучения: ~60 мин 🎯 Сложность: Повторение
#join #where #null #select #union

⚡ Кратко: домашнее задание

  • Объедините orders и purchase_orders через UNION.
  • Добавьте фильтр IS NOT NULL и столбец-источник.
  • Соедините order_details с purchase_orders.
  • Посчитайте инвойсы по клиентам.

🏠 Разбор домашнего задания

Все задания выполняются в базе northwind.

Задание 1. UNION orders и purchase_orders

Выведите одним запросом с использованием UNION столбцы id, employee_id из таблицы orders и соответствующие им столбцы из таблицы purchase_orders. В таблице purchase_orders столбец created_by соответствует employee_id.

USE northwind;

SELECT id, employee_id
FROM orders
UNION
SELECT id, created_by
FROM purchase_orders;

Задание 2. Фильтрация и источник

Из предыдущего запроса удалите записи, где employee_id не имеет значения. Добавьте столбец с указанием таблицы-источника.

USE northwind;

SELECT id, employee_id, 'orders' AS source
FROM orders
WHERE employee_id IS NOT NULL
UNION
SELECT id, created_by, 'purchase_orders' AS source
FROM purchase_orders
WHERE created_by IS NOT NULL;

Задание 3. JOIN order_details и purchase_orders

Выведите все столбцы таблицы order_details, а также дополнительный столбец payment_method из таблицы purchase_orders. Оставьте только заказы, для которых известен payment_method.

USE northwind;

SELECT od.*, po.payment_method
FROM order_details AS od
INNER JOIN purchase_orders AS po
  ON od.purchase_order_id = po.id
WHERE po.payment_method IS NOT NULL;

Задание 4. Заказы с инвойсами

Выведите заказы orders и фамилии клиентов customers для тех заказов, по которым были инвойсы (таблица invoices).

USE northwind;

SELECT o.id AS order_id, c.last_name
FROM orders AS o
INNER JOIN customers AS c
  ON o.customer_id = c.id
INNER JOIN invoices AS i
  ON o.id = i.order_id;

Задание 5. Подсчёт инвойсов по клиентам

Подсчитайте количество инвойсов для каждого клиента из предыдущего запроса.

USE northwind;

SELECT c.id, c.last_name, COUNT(i.id) AS invoice_count
FROM orders AS o
INNER JOIN customers AS c
  ON o.customer_id = c.id
INNER JOIN invoices AS i
  ON o.id = i.order_id
GROUP BY c.id, c.last_name;