Занятие 28. Summary session 7
⚡ Кратко: типичные ошибки
- Путаница между
INNER JOINиLEFT JOIN. - CTE без скобок или использование CTE в другом запросе.
- Скалярный оператор с многострочным подзапросом.
🐛 Типичные ошибки и исправления
Ошибка 1. INNER JOIN вместо LEFT JOIN
Неправильно:
SELECT e.first_name, e.last_name
FROM employees AS e
JOIN employee_privileges AS ep ON e.id = ep.employee_id
WHERE ep.employee_id IS NULL;
Почему плохо: 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;
Ошибка 2. Пропуск скобок в CTE
Неправильно:
WITH avg_price AS
SELECT AVG(unit_price) AS ap FROM order_details
SELECT * FROM order_details
WHERE unit_price > (SELECT ap FROM avg_price);
Правильно:
WITH avg_price AS (
SELECT AVG(unit_price) AS ap FROM order_details
)
SELECT * FROM order_details
WHERE unit_price > (SELECT ap FROM avg_price);
Ошибка 3. Скалярный оператор с многострочным подзапросом
Неправильно:
SELECT *
FROM orders
WHERE employee_id = (
SELECT id FROM employees WHERE job_title = 'Sales Representative'
);
Почему плохо: если таких сотрудников несколько, подзапрос вернёт несколько строк, и = выдаст ошибку.
Правильно:
SELECT *
FROM orders
WHERE employee_id IN (
SELECT id FROM employees WHERE job_title = 'Sales Representative'
);
Ошибка 4. Использование CTE в другом запросе
CTE существует только в рамках одного запроса. Если нужно переиспользовать результат, используйте временную таблицу или объедините логику в один запрос.