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

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

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

⚡ Кратко: повтор перед практикой

  • UNION ALL склеивает строки; UNION ещё и удаляет дубликаты.
  • LEFT JOIN ... IS NULL находит записи без связи.
  • Многотабличные JOIN читаются слева направо.

📖 Теория, необходимая для практикума

1. UNION и UNION ALL

Оба оператора объединяют результаты нескольких SELECT. Важные правила:

  • Количество столбцов в каждом SELECT должно совпадать.
  • Типы данных в соответствующих столбцах должны быть совместимы.
  • UNION удаляет дубликаты; UNION ALL — нет, но работает быстрее.
SELECT company FROM employees
UNION ALL
SELECT company FROM customers
UNION ALL
SELECT company FROM suppliers;

2. INNER JOIN vs LEFT JOIN

  • INNER JOIN — только пары строк с совпадающими ключами.
  • LEFT JOIN — все строки левой таблицы; для несовпадений справа возвращается NULL.

3. Поиск записей без связи

Классический приём: LEFT JOIN + проверка IS NULL в правой таблице.

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;

Этот паттерн часто называют anti-join: находим строки, для которых нет связанных записей.

4. Соединение трёх и более таблиц

Каждый следующий JOIN применяется к результату предыдущего:

SELECT it.transaction_created_date, itt.type_name, p.product_name
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;

5. Фильтрация групп

Если нужно отфильтровать строки до группировки — используем WHERE. Если условие на агрегат — используем HAVING.

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