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

🐛 Типичные ошибки

⚡ Кратко: ошибки

  • Фильтрация агрегата через 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;