Пропуск 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;