← К оглавлению занятия
⚡ Кратко: ошибки
- Фильтрация агрегата через
WHERE вместо HAVING.
LIKE 'L' вместо LIKE 'L%'.
- Забытые кавычки у строковых значений.
JOIN без условия связи.
- Разное количество столбцов в
UNION.
LIMIT без ORDER BY — непредсказуемый порядок.
1
Фильтрация агрегата через WHERE
Агрегатные функции нельзя использовать в WHERE. Для фильтрации групп используется HAVING.
-- Неправильно
SELECT maker, AVG(speed) FROM PC JOIN Product USING(model)
WHERE AVG(speed) >= 500
GROUP BY maker;
Как исправить:
-- Правильно
SELECT maker, AVG(speed) AS avg_speed
FROM PC JOIN Product USING(model)
GROUP BY maker
HAVING AVG(speed) >= 500;
2
LIKE без символа подстановки
Запрос ищет только фамилию, точно равную L, а не все фамилии на букву L.
-- Неправильно
SELECT * FROM employees WHERE last_name LIKE 'L';
Как исправить:
-- Правильно
SELECT * FROM employees WHERE last_name LIKE 'L%';
3
Строковые значения без кавычек
СУБД воспринимает Lex как имя столбца и выдаёт ошибку.
-- Неправильно
SELECT salary FROM employees WHERE first_name = Lex AND last_name = De Haan;
Как исправить:
-- Правильно
SELECT salary FROM employees
WHERE first_name = 'Lex' AND last_name = 'De Haan';
4
JOIN без условия связи
Отсутствие ON или USING приводит к декартову произведению.
-- Неправильно
SELECT * FROM PC JOIN Product;
Как исправить:
-- Правильно
SELECT * FROM PC JOIN Product USING(model);
5
Неправильное использование UNION
Объединяемые запросы должны иметь одинаковое число столбцов и совместимые типы.
-- Неправильно
SELECT model, price FROM PC
UNION
SELECT model FROM Laptop;
Как исправить:
-- Правильно
SELECT model, price FROM PC
UNION ALL
SELECT model, price FROM Laptop;
6
LIMIT без ORDER BY
Без сортировки LIMIT возвращает произвольный набор строк.
-- Неправильно
SELECT * FROM PC LIMIT 5;
Как исправить:
-- Правильно
SELECT * FROM PC ORDER BY price DESC LIMIT 5;
7
Неполная группировка
В SELECT присутствуют неагрегированные столбцы, которых нет в GROUP BY.
-- Неправильно
SELECT service_class, id, AVG(price) FROM tickets GROUP BY service_class;
Как исправить: оставьте только группируемые и агрегированные столбцы.
-- Правильно
SELECT service_class, AVG(price) AS avg_price
FROM tickets
GROUP BY service_class;