Pepelen
Аналитика данных с нуля: SQL, таблицы и метрики

Lesson

Урок 3. Порядок предложений и порядок выполнения

Восстанавливать правильный порядок предложений запроса и понимать, что логический порядок выполнения отличается от порядка записи.

1 / 7

Логический порядок выполнения SQL-запроса

Порядок записи ≠ порядок выполнения

Вы пишете SQL в одном порядке, но база данных выполняет предложения совсем иначе. Эта схема объясняет, почему алиас из SELECT нельзя использовать в WHERE.
Lesson notes
Порядок записи и порядок выполнения SQL
SQL-запрос пишется в строго определённом порядке: SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT. Нарушить этот порядок нельзя — СУБД вернёт ошибку. Запомните: SELECT всегда первое слово запроса, LIMIT — всегда последнее. Однако движок базы данных выполняет запрос совсем в другом порядке — это называется логическим порядком выполнения: FROM → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT. Сначала определяется источник данных (FROM), затем фильтруются строки (WHERE), потом группировка и фильтр по группам, и только потом SQL «смотрит» на список столбцов в SELECT. Почему это важно на практике? Допустим, вы написали SELECT amount * 1.2 AS amount_with_vat FROM orders WHERE amount_with_vat > 100. Этот запрос завершится ошибкой: когда WHERE выполняется, алиас amount_with_vat ещё не существует — SELECT не успел его создать. Правильно: WHERE amount * 1.2 > 100. А вот в ORDER BY алиас уже работает, потому что ORDER BY выполняется после SELECT. Например: SELECT amount * 1.2 AS amount_with_vat FROM orders ORDER BY amount_with_vat DESC — здесь всё корректно. Это одно из частых заблуждений новичков: они думают, что раз SELECT написан первым, значит он и выполняется первым. На самом деле FROM и WHERE отрабатывают значительно раньше.
Урок 3. Порядок предложений и порядок выполнения — Аналитика данных с нуля: SQL, таблицы и метрики