Learnly
SQL для аналитиков/Глава 9/Урок 1

Типичные ошибки новичков в SQL

Типичные ошибки новичков в 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, и путаница с порядком выполнения.