← Аналитика данных с нуля: SQL, таблицы и метрики
Lesson
Урок 3. Порядок предложений и порядок выполнения
Восстанавливать правильный порядок предложений запроса и понимать, что логический порядок выполнения отличается от порядка записи.
Логический порядок выполнения 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 отрабатывают значительно раньше.