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

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

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

  • LIKE 'L' вместо LIKE 'L%' — не находит все фамилии.
  • Фильтрация агрегата через WHERE вместо HAVING.
  • Забытые кавычки у строковых значений: WHERE first_name = Lex.
  • JOIN без условия — декартово произведение.
  • Оконная функция в том же запросе, где есть GROUP BY без вложенного запроса.
1

LIKE без символа подстановки

Запрос ищет только фамилию, точно равную L, а не все фамилии на букву L.

-- Неправильно
SELECT * FROM employees WHERE last_name LIKE 'L';

Как исправить:

-- Правильно
SELECT * FROM employees WHERE last_name LIKE 'L%';
2

Строковые значения без кавычек

СУБД воспринимает 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';
3

Фильтрация агрегата через WHERE

Агрегатные функции нельзя использовать в WHERE. Для фильтрации групп используется HAVING.

-- Неправильно
SELECT service_class, AVG(price) FROM tickets
WHERE AVG(price) > 100
GROUP BY service_class;

Как исправить:

-- Правильно
SELECT service_class, AVG(price) AS avg_price
FROM tickets
GROUP BY service_class
HAVING AVG(price) > 100;
4

JOIN без условия связи

Отсутствие ON приводит к декартову произведению: количество строк резко возрастает.

-- Неправильно
SELECT country.Name, city.Name FROM country JOIN city;

Как исправить:

-- Правильно
SELECT country.Name, city.Name
FROM country
JOIN city ON country.Capital = city.ID;
5

Неполная группировка

В 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;
6

Оконная функция в запросе с GROUP BY

Нельзя сразу применить RANK() к агрегированным данным в одном запросе. Нужен подзапрос или CTE.

-- Неправильно
SELECT trips.id, COUNT(tickets.id), RANK() OVER (ORDER BY COUNT(tickets.id) DESC)
FROM trips JOIN tickets ON trips.id = tickets.trip_id
GROUP BY trips.id;

Как исправить:

-- Правильно
SELECT id, trip_no, ticket_count,
       RANK() OVER (ORDER BY ticket_count DESC) AS trip_rank
FROM (
    SELECT trips.id, trips.trip_no, COUNT(tickets.id) AS ticket_count
    FROM trips
    JOIN tickets ON trips.id = tickets.trip_id
    GROUP BY trips.id, trips.trip_no
) AS trip_stats;