Занятие 22. Операторы JOIN и UNION
⚡ Кратко: типичные ошибки
- Пропуск
ONу JOIN — декартово произведение. - Разное число столбцов в
UNION. - Путаница
LEFT/RIGHTJOIN.
🐛 Типичные ошибки и исправления
Ошибка 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;