Занятие 25. Подзапросы
⚡ Кратко: типичные ошибки
=вместо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).