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

Занятие 22. Операторы JOIN и UNION

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

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

  • Объединение имён клиентов и сотрудников через UNION ALL.
  • Соединение order_details с products для получения имён продуктов.
  • Многотабличный LEFT JOIN с purchase_orders.

💻 Рабочие примеры

Пример 1. UNION ALL с пометкой источника

USE northwind;

SELECT first_name, last_name, 'employee' AS source
FROM employees
UNION ALL
SELECT first_name, last_name, 'customer' AS source
FROM customers;

Возвращает все имена и фамилии из обеих таблиц с указанием, сотрудник это или клиент.

Пример 2. INNER JOIN: имена продуктов в заказах

USE northwind;

SELECT od.order_id, p.product_name
FROM order_details AS od
INNER JOIN products AS p
  ON od.product_id = p.id;

Показывает идентификаторы заказов и названия продуктов вместо числовых product_id.

Пример 3. COUNT с JOIN и GROUP BY

USE northwind;

SELECT p.product_name, COUNT(od.order_id) AS order_count
FROM order_details AS od
INNER JOIN products AS p
  ON od.product_id = p.id
GROUP BY p.product_name;

Считает, сколько раз каждый продукт встречается в заказах.

Пример 4. LEFT JOIN + LEFT JOIN: сохраняем все строки order_details

USE northwind;

SELECT od.order_id, p.product_name, po.payment_amount
FROM order_details AS od
LEFT JOIN products AS p
  ON od.product_id = p.id
LEFT JOIN purchase_orders AS po
  ON od.purchase_order_id = po.id;

Выводит все строки order_details. Если продукт или закупка неизвестны, в соответствующих столбцах будет NULL.

Пример 5. Сравнение INNER, LEFT, RIGHT JOIN

USE northwind;

-- Только сотрудники с привилегиями
SELECT *
FROM employees AS e
INNER JOIN employee_privileges AS ep
  ON e.id = ep.employee_id;

-- Все сотрудники, даже без привилегий
SELECT *
FROM employees AS e
LEFT JOIN employee_privileges AS ep
  ON e.id = ep.employee_id;

-- Все привилегии, даже без сотрудников (редкий случай)
SELECT *
FROM employees AS e
RIGHT JOIN employee_privileges AS ep
  ON e.id = ep.employee_id;
Проверить по документации: в учебных заданиях предполагается схема northwind с конкретными именами столбцов. В реальных базах northwind имена могут отличаться.