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

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

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

  • WHERE вместо HAVING для фильтрации агрегатов.
  • Пропуск DISTINCT, когда нужны уникальные значения.
  • Самосоединение без условия model1 > model2 — дубли пар.
  • JOIN без условия — декартово произведение.
  • Неправильные псевдонимы в самосоединении.
1

Ошибка: фильтрация агрегата через WHERE

Агрегатные функции вычисляются после группировки, поэтому их нельзя использовать в WHERE.

-- Неправильно
SELECT hd, COUNT(model)
FROM PC
WHERE COUNT(model) >= 2
GROUP BY hd;

Как исправить: использовать HAVING.

-- Правильно
SELECT hd
FROM PC
GROUP BY hd
HAVING COUNT(model) >= 2;
2

Ошибка: дубли вместо DISTINCT

Если один производитель выпускает несколько моделей принтеров, без DISTINCT он повторится.

-- Неправильно
SELECT maker
FROM Product
WHERE type = 'Printer';

Как исправить: добавить DISTINCT.

-- Правильно
SELECT DISTINCT maker
FROM Product
WHERE type = 'Printer';
3

Ошибка: самосоединение без условия на пары

Без условия pc1.model > pc2.model результат содержит зеркальные пары и строки, где модель сравнивается сама с собой.

-- Неправильно
SELECT pc1.model, pc2.model, pc1.speed, pc1.ram
FROM PC AS pc1
JOIN PC AS pc2
  ON pc1.speed = pc2.speed
 AND pc1.ram   = pc2.ram;

Как исправить: добавить pc1.model > pc2.model.

-- Правильно
SELECT DISTINCT pc1.model, pc2.model, pc1.speed, pc1.ram
FROM PC AS pc1
JOIN PC AS pc2
  ON pc1.speed = pc2.speed
 AND pc1.ram   = pc2.ram
 AND pc1.model > pc2.model;
4

Ошибка: JOIN без условия

Если забыть указать связь по model, получится декартово произведение.

-- Неправильно
SELECT maker, speed
FROM Product, Laptop;

Как исправить: явно указать соединение.

-- Правильно
SELECT DISTINCT maker, speed
FROM Product
JOIN Laptop USING (model)
WHERE hd >= 10;
5

Ошибка: путаница в псевдонимах самосоединения

Неправильный псевдоним в условии может привести к некорректному сравнению.

-- Неправильно: сравниваем pc1 с pc1
SELECT pc1.model, pc2.model
FROM PC AS pc1
JOIN PC AS pc2
  ON pc1.speed = pc1.speed;

Как исправить: следить за псевдонимами в условиях.

-- Правильно
SELECT DISTINCT pc1.model, pc2.model
FROM PC AS pc1
JOIN PC AS pc2
  ON pc1.speed = pc2.speed
 AND pc1.model > pc2.model;
6

Ошибка: не учитывать тип продукта при JOIN

Если в Product могут встречаться модели разных типов, нужно фильтровать по type, чтобы не смешивать ПК и ноутбуки.

-- Надёжнее
SELECT DISTINCT maker, speed
FROM Product
JOIN Laptop USING (model)
WHERE Product.type = 'Laptop'
  AND hd >= 10;