Типичные ошибки новичков в SQL
Разберём самые частые ошибки, и как их избежать.
1. SELECT * везде
-- Плохо
SELECT * FROM orders;
-- Хорошо
SELECT id, customer_id, amount, status, created_at FROM orders;
SELECT *, удобен для быстрого изучения таблицы. В production-запросах, лишняя нагрузка.
2. Сравнение с NULL через =
-- Не работает! Всегда вернёт 0 строк
WHERE email = NULL
-- Правильно
WHERE email IS NULL
WHERE email IS NOT NULL
NULL, специальное значение. Любое сравнение с NULL через = возвращает NULL (не True и не False).
3. Подсчёт с дублями
-- Посчитает все строки включая дубли
SELECT COUNT(customer_id) FROM orders;
-- Посчитает уникальных клиентов
SELECT COUNT(DISTINCT customer_id) FROM orders;
4. Умножение строк при JOIN
-- orders: 100 строк
-- order_items: 300 строк (3 позиции на заказ в среднем)
-- После JOIN: 300 строк, и SUM(amount) будет утроен!
SELECT SUM(o.amount)
FROM orders o
JOIN order_items oi ON oi.order_id = o.id;
Всегда проверяй: не умножились ли строки после JOIN?
5. WHERE вместо HAVING
-- Ошибка: агрегат нельзя использовать в WHERE
SELECT city, COUNT(*) AS cnt
FROM users
WHERE COUNT(*) > 5 -- SyntaxError!
GROUP BY city;
-- Правильно
SELECT city, COUNT(*) AS cnt
FROM users
GROUP BY city
HAVING COUNT(*) > 5;
6. Порядок выполнения vs порядок написания
SQL выполняется не в том порядке, в котором написан:
1. FROM / JOIN
2. WHERE
3. GROUP BY
4. HAVING
5. SELECT
6. ORDER BY
7. LIMIT
Поэтому нельзя использовать псевдоним из SELECT в WHERE, WHERE выполняется раньше.
-- Ошибка: псевдоним total ещё не существует на этапе WHERE
SELECT amount * quantity AS total FROM orders WHERE total > 1000;
-- Правильно
SELECT amount * quantity AS total FROM orders WHERE amount * quantity > 1000;
💡 Главная мысль: Большинство SQL-ошибок, не синтаксические, а логические. Самые коварные: NULL, умножение строк при JOIN, и путаница с порядком выполнения.