Видео недоступно для предпросмотра
Смотреть в Telegram
🗂 Порядок выполнения sql запроса — и почему алиас в WHERE не работает:
Часто вижу одну и ту же ошибку — человек пишет запрос, придумывает алиас в SELECT, а потом пытается использовать его в WHERE или HAVING. И получает ошибку. Почему?
Всё дело в порядке выполнения SQL.
На самом деле SQL выполняется совсем не в том порядке, в котором мы его пишем. Вот реальная последовательность:
1️⃣ FROM — сначала движок идёт к таблицам
2️⃣ JOIN — потом движок соединяет таблицы
2️⃣ WHERE — фильтрует строки до группировки
3️⃣ GROUP BY — группирует данные
4️⃣ HAVING — фильтрует уже сгруппированные данные
5️⃣ SELECT — только сейчас вычисляются выражения и алиасы
6️⃣ ORDER BY — сортировка результата
7️⃣ LIMIT — обрезание до нужного числа строк
Пример 1 — классическая ошибка с алиасом:
-- ❌ Не работает — алиас revenue ещё не существует на шаге WHERE
SELECT
order_id,
amount * 0.9 AS revenue
FROM orders
WHERE revenue > 1000;
-- ✅ Правильно — повторяем выражение напрямую
SELECT
order_id,
amount * 0.9 AS revenue
FROM orders
WHERE amount * 0.9 > 1000;
Пример 2 — почему HAVING, а не WHERE:
-- ❌ Нельзя — WHERE выполняется ДО GROUP BY
SELECT
user_id,
COUNT(*) AS order_count
FROM orders
GROUP BY user_id
WHERE order_count > 5;
-- ✅ Правильно — HAVING фильтрует после группировки
SELECT
user_id,
COUNT(*) AS order_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) > 5;
Пример 3 — вот почему все пишут CTE:
Иногда хочется сначала что-то посчитать, а потом фильтровать по результату. Именно для этого и придумали CTE — они позволяют «сохранить» промежуточный результат и работать с ним как с таблицей.
-- ✅ CTE решает проблему: сначала считаем, потом фильтруем
WITH revenue_calc AS (
SELECT
order_id,
amount * 0.9 AS revenue
FROM orders
)
SELECT *
FROM revenue_calc
WHERE revenue > 1000;
Видите? В CTE SELECT уже выполнился — алиас revenue существует — и теперь во внешнем запросе WHERE отрабатывает по нему без проблем.
Итог: 🤩
❤️ Поддержать канал бустами, чтобы у автора появился дополнительный функционал можно - здесь (это бесплатно и доступно с подпиской telegram premium)
❓ Сталкивались с этой ошибкой? Или, может, объясняете это джунам — как объясняете? Пишите в комментах!
✔️ Подпишитесь на канал, чтобы не пропустить следующие хаки.
🚬 Вопросы, обучение, консультации: Написать в ЛС | mentor.dima-sqlit.ru
@dima_sqlit
Часто вижу одну и ту же ошибку — человек пишет запрос, придумывает алиас в SELECT, а потом пытается использовать его в WHERE или HAVING. И получает ошибку. Почему?
Всё дело в порядке выполнения SQL.
На самом деле SQL выполняется совсем не в том порядке, в котором мы его пишем. Вот реальная последовательность:
1️⃣ FROM — сначала движок идёт к таблицам
2️⃣ JOIN — потом движок соединяет таблицы
2️⃣ WHERE — фильтрует строки до группировки
3️⃣ GROUP BY — группирует данные
4️⃣ HAVING — фильтрует уже сгруппированные данные
5️⃣ SELECT — только сейчас вычисляются выражения и алиасы
6️⃣ ORDER BY — сортировка результата
7️⃣ LIMIT — обрезание до нужного числа строк
Пример 1 — классическая ошибка с алиасом:
-- ❌ Не работает — алиас revenue ещё не существует на шаге WHERE
SELECT
order_id,
amount * 0.9 AS revenue
FROM orders
WHERE revenue > 1000;
-- ✅ Правильно — повторяем выражение напрямую
SELECT
order_id,
amount * 0.9 AS revenue
FROM orders
WHERE amount * 0.9 > 1000;
Пример 2 — почему HAVING, а не WHERE:
-- ❌ Нельзя — WHERE выполняется ДО GROUP BY
SELECT
user_id,
COUNT(*) AS order_count
FROM orders
GROUP BY user_id
WHERE order_count > 5;
-- ✅ Правильно — HAVING фильтрует после группировки
SELECT
user_id,
COUNT(*) AS order_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) > 5;
Пример 3 — вот почему все пишут CTE:
Иногда хочется сначала что-то посчитать, а потом фильтровать по результату. Именно для этого и придумали CTE — они позволяют «сохранить» промежуточный результат и работать с ним как с таблицей.
-- ✅ CTE решает проблему: сначала считаем, потом фильтруем
WITH revenue_calc AS (
SELECT
order_id,
amount * 0.9 AS revenue
FROM orders
)
SELECT *
FROM revenue_calc
WHERE revenue > 1000;
Видите? В CTE SELECT уже выполнился — алиас revenue существует — и теперь во внешнем запросе WHERE отрабатывает по нему без проблем.
Итог: 🤩
❤️ Поддержать канал бустами, чтобы у автора появился дополнительный функционал можно - здесь (это бесплатно и доступно с подпиской telegram premium)
❓ Сталкивались с этой ошибкой? Или, может, объясняете это джунам — как объясняете? Пишите в комментах!
✔️ Подпишитесь на канал, чтобы не пропустить следующие хаки.
🚬 Вопросы, обучение, консультации: Написать в ЛС | mentor.dima-sqlit.ru
@dima_sqlit