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

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

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

⚡ Кратко: типичные ошибки

  • Пропуск ON у JOIN — декартово произведение.
  • Разное число столбцов в UNION.
  • Путаница LEFT / RIGHT JOIN.

🐛 Типичные ошибки и исправления

Ошибка 1. JOIN без ON

Неправильно:

SELECT *
FROM employees AS e
JOIN employee_privileges AS ep;  -- нет ON

Почему плохо: получится декартово произведение: каждая строка одной таблицы соединится с каждой строкой другой. В больших таблицах это может «повесить» запрос.

Правильно:

SELECT *
FROM employees AS e
JOIN employee_privileges AS ep
  ON e.id = ep.employee_id;

Ошибка 2. Разное число столбцов в UNION

Неправильно:

SELECT first_name, last_name FROM employees
UNION
SELECT first_name FROM customers;  -- разное число столбцов

Почему плохо: SQL выдаст ошибку: «The used SELECT statements have a different number of columns».

Правильно:

SELECT first_name, last_name FROM employees
UNION
SELECT first_name, last_name FROM customers;

Ошибка 3. Путаница LEFT / RIGHT JOIN

Неправильно: ожидать, что RIGHT JOIN вернёт «всё слева».

Правильно: левая таблица — та, что после FROM; правая — та, что после JOIN. Чтобы не путаться, большинство команд использует только LEFT JOIN, меняя порядок таблиц.

Ошибка 4. UNION вместо UNION ALL без необходимости

Неправильно: использовать UNION, когда дубликаты заведомо невозможны.

Почему плохо: СУБД тратит ресурсы на поиск и удаление дубликатов.

Правильно: если дубликаты не важны, используйте UNION ALL.

Ошибка 5. Фильтрация в WHERE вместо ON для OUTER JOIN

Неправильно:

SELECT *
FROM employees AS e
LEFT JOIN employee_privileges AS ep
  ON e.id = ep.employee_id
WHERE ep.privilege_id = 5;

Почему плохо: условие в WHERE отбрасывает строки с NULL справа, превращая LEFT JOIN фактически в INNER JOIN.

Правильно:

SELECT *
FROM employees AS e
LEFT JOIN employee_privileges AS ep
  ON e.id = ep.employee_id
  AND ep.privilege_id = 5;