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

Занятие 28. Summary session 7

📁 Блок: SQL / MySQL / Подзапросы и CTE ⏱️ Время изучения: ~60 мин 🎯 Сложность: Повторение
#in #where #select #from #as #join #null

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

  • Путаница между 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 существует только в рамках одного запроса. Если нужно переиспользовать результат, используйте временную таблицу или объедините логику в один запрос.