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

Занятие 23. Практикум 6

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

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

  • Найдите клиентов без заказов.
  • Посчитайте количество заказов у каждого сотрудника.
  • Объедините продукты и закупки одним запросом.

🏠 Домашнее задание

Все задания выполняются в базе northwind. Они дополняют практикум и готовят к summary session.

Задание 1. Клиенты без заказов

Выведите имена и фамилии клиентов из таблицы customers, у которых нет ни одного заказа в таблице orders.

Пошаговое решение

Соединяем customers с orders через LEFT JOIN и ищем строки, где orders.id IS NULL.

USE northwind;

SELECT c.first_name, c.last_name
FROM customers AS c
LEFT JOIN orders AS o
  ON c.id = o.customer_id
WHERE o.id IS NULL;

Задание 2. Количество заказов у каждого сотрудника

Для каждого сотрудника выведите имя и количество заказов, которые он оформил. Включите сотрудников без заказов — у них должно быть 0.

Пошаговое решение

USE northwind;

SELECT e.first_name, e.last_name, COUNT(o.id) AS order_count
FROM employees AS e
LEFT JOIN orders AS o
  ON e.id = o.employee_id
GROUP BY e.id, e.first_name, e.last_name;

Примечание: COUNT(o.id) возвращает 0 для сотрудников без заказов, потому что COUNT не считает NULL.

Задание 3. Объединение продуктов и закупок

Выведите одним запросом названия продуктов из таблицы products и названия продуктов из таблицы purchase_orders (столбец inventory_id можно заменить на название продукта через JOIN, если связь существует). Добавьте столбец, показывающий источник строки.

Пошаговое решение

Предположим, что purchase_orders связана с products через inventory_id:

USE northwind;

SELECT p.product_name, 'product' AS source
FROM products AS p
UNION ALL
SELECT p.product_name, 'purchase_order' AS source
FROM purchase_orders AS po
JOIN products AS p
  ON po.inventory_id = p.id;

Задание 4. Заказы с расшифровкой статуса

В таблице orders есть столбец status_id. Расшифруйте его значения через таблицу orders_status, если она есть в базе. Выведите идентификатор заказа и название статуса.

Пошаговое решение

USE northwind;

SELECT o.id, os.status_name
FROM orders AS o
LEFT JOIN orders_status AS os
  ON o.status_id = os.id;
Проверить по документации: точные имена таблиц и столбцов зависят от конкретной схемы northwind. Если orders_status отсутствует, задание следует адаптировать под доступные таблицы.