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

Занятие 25. Подзапросы

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

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

  • = вместо IN для многострочного подзапроса.
  • Пропуск скобок вокруг подзапроса.
  • Отсутствие алиаса у подзапроса в FROM.

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

Ошибка 1. = с многострочным подзапросом

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

SELECT * FROM orders
WHERE customer_id = (
    SELECT id FROM customers WHERE city = 'Los Angeles'
);

Почему плохо: если в городе несколько клиентов, подзапрос вернёт несколько строк, и = выдаст ошибку.

Правильно:

SELECT * FROM orders
WHERE customer_id IN (
    SELECT id FROM customers WHERE city = 'Los Angeles'
);

Ошибка 2. Пропуск скобок

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

SELECT * FROM order_details
WHERE unit_price > SELECT AVG(unit_price) FROM order_details;

Правильно:

SELECT * FROM order_details
WHERE unit_price > (SELECT AVG(unit_price) FROM order_details);

Ошибка 3. Подзапрос в FROM без алиаса

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

SELECT *
FROM (SELECT product_id, COUNT(*) AS c FROM order_details GROUP BY product_id)
JOIN products ON product_id = products.id;

Почему плохо: MySQL требует, чтобы каждая таблица в FROM имела имя (алиас).

Правильно:

SELECT *
FROM (SELECT product_id, COUNT(*) AS c FROM order_details GROUP BY product_id) AS ps
JOIN products ON ps.product_id = products.id;

Ошибка 4. Слишком глубокая вложенность

Глубоко вложенные подзапросы сложно читать и отлаживать. Если логика усложняется, рассмотрите JOIN или WITH (CTE).