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

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

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

⚡ Кратко: примеры

  • Объединение компаний из трёх таблиц.
  • Поиск сотрудников без привилегий.
  • Расшифровка заказов через LEFT JOIN.

💻 Разбор типовых запросов

Пример 1. Объединение компаний из трёх таблиц

USE northwind;

SELECT company FROM employees
UNION ALL
SELECT company FROM customers
UNION ALL
SELECT company FROM suppliers;

Выводит общий список названий компаний. Поскольку названия могут повторяться, UNION ALL быстрее, чем UNION.

Пример 2. Поиск сотрудников без привилегий

USE northwind;

SELECT e.first_name, e.last_name
FROM employees AS e
LEFT JOIN employee_privileges AS ep
  ON e.id = ep.employee_id
WHERE ep.employee_id IS NULL;

LEFT JOIN сохраняет всех сотрудников. Те, у кого нет записи в employee_privileges, получат NULL в столбцах правой таблицы. Фильтр IS NULL оставляет только таких сотрудников.

Пример 3. Расшифровка заказа с LEFT JOIN

USE northwind;

SELECT o.id, e.first_name AS employee, c.company_name AS customer,
       s.company AS shipper
FROM orders AS o
LEFT JOIN employees AS e
  ON o.employee_id = e.id
LEFT JOIN customers AS c
  ON o.customer_id = c.id
LEFT JOIN shippers AS s
  ON o.shipper_id = s.id
WHERE o.ship_city = 'Seattle';

LEFT JOIN важен, потому что в реальной базе у некоторых заказов могут отсутствовать сотрудники, клиенты или перевозчики. INNER JOIN скрыл бы такие заказы.

Пример 4. Подсчёт транзакций по типу с фильтром

USE northwind;

SELECT itt.type_name, COUNT(*) AS transaction_count
FROM inventory_transactions AS it
JOIN inventory_transaction_types AS itt
  ON it.transaction_type = itt.id
JOIN products AS p
  ON it.product_id = p.id
WHERE itt.type_name NOT LIKE '%Sold%'
GROUP BY itt.type_name;

Фильтр WHERE отбрасывает типы со словом Sold до группировки. COUNT(*) считает оставшиеся транзакции.