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;