Логический порядок выполнения запроса
Узнайте, почему FROM выполняется раньше SELECT и как истинный порядок выполнения помогает отвечать на множество каверзных вопросов.
«Логический порядок выполнения запроса» — бесплатный урок SQL Interview Prep на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Interview Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Interview Prep содержит 4 уроков всего.
Вопрос, открывающий путь к десятку других
Собеседующие спрашивают: «В каком порядке на самом деле выполняется запрос?» — потому что ответ объясняет многое: почему псевдоним SELECT не работает в WHERE, почему WHERE не может фильтровать результат агрегирования, и не только это.
Порядок записи и логический порядок
Вы пишете запрос, начиная с SELECT, но движок выполняет его, начиная с FROM. Это несоответствие, а также почти последнее выполнение SELECT, и вызывают большую часть недоразумений.
Полный логический порядок
Полный логический порядок таков: FROM, затем WHERE, GROUP BY, HAVING, SELECT, DISTINCT, ORDER BY и наконец LIMIT. Все приведённые ниже подводные камни напрямую следуют из этого списка.
Почему FROM выполняется первым
FROM выполняется первым, потому что движку нужны строки для работы, прежде чем он сможет сделать что-либо ещё. Сначала он формирует исходные строки, и только потом WHERE может решить, какие из них оставить.
SELECT e.name, d.name AS dept
FROM employees e
JOIN departments d ON d.id = e.department_id
WHERE e.salary > 50000;Подводный камень: псевдоним нельзя использовать в WHERE
Самое часто задаваемое следствие этого порядка: псевдоним SELECT нельзя использовать в WHERE, потому что WHERE выполняется раньше SELECT. Приведённый ниже код показывает ошибку и исправление: повторите выражение.
-- FAILS: alias 'annual' unknown in WHERE
SELECT salary * 12 AS annual
FROM employees
WHERE annual > 600000;
-- FIX: repeat the expression
SELECT salary * 12 AS annual
FROM employees
WHERE salary * 12 > 600000;Подводный камень: WHERE не видит агрегаты
WHERE выполняется до группировки, поэтому он не видит агрегаты, такие как COUNT(). Для этого предназначен HAVING: WHERE фильтрует строки, а HAVING — группы после агрегирования.
-- WHERE cannot use COUNT(*)
SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department
HAVING COUNT(*) > 5;Почему ORDER BY может использовать псевдонимы
Обратная ситуация: ORDER BY выполняется после SELECT, поэтому он может использовать псевдонимы SELECT. Псевдоним тот же, но момент выполнения другой — поэтому здесь он работает, а в WHERE нет.
SELECT name, salary * 12 AS annual
FROM employees
ORDER BY annual DESC;Где находится DISTINCT
DISTINCT выполняется после SELECT, но до ORDER BY. Поскольку он удаляет дубликаты по выходным столбцам, сортировать можно только по тому, что осталось в списке SELECT.
-- ERROR in many engines:
-- ORDER BY column not in the DISTINCT select list
SELECT DISTINCT department
FROM employees
ORDER BY hire_date;Пошаговое выполнение полного запроса
Проследим выполнение настоящего запроса: FROM читает строки, WHERE фильтрует их, GROUP BY распределяет по группам, HAVING оставляет нужные группы, SELECT вычисляет значения, ORDER BY сортирует, а LIMIT ограничивает результат.
SELECT customer_id, SUM(amount) AS total
FROM orders
WHERE status = 'paid'
GROUP BY customer_id
HAVING SUM(amount) > 1000
ORDER BY total DESC
LIMIT 10;Логическое и физическое выполнение
Есть важная деталь, которая производит хорошее впечатление: это логический порядок, определяющий корректность результата. Физический план оптимизатора может отличаться, если в итоге он возвращает те же строки.
Как запомнить порядок
Для запоминания представьте, как строки движутся по конвейеру: на каждом шаге следующий этап получает всё меньший набор. Если что-то не работает, проверьте, создал ли предыдущий этап необходимые данные.
Быстрая проверка
Примените порядок выполнения, чтобы найти ошибку.
Итоги
Итак: логический порядок таков — FROM, WHERE, GROUP BY, HAVING, SELECT, DISTINCT, ORDER BY, LIMIT. WHERE выполняется до SELECT, поэтому псевдонимы недоступны; ORDER BY выполняется после него, поэтому псевдонимы работают.
Часто задаваемые вопросы
Урок «Логический порядок выполнения запроса» бесплатный?
Да — полный текст урока «Логический порядок выполнения запроса» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Interview Prep, подпишись на CoddyKit PRO. Курс SQL Interview Prep содержит 4 уроков всего.
Чему я научусь в уроке «Логический порядок выполнения запроса»?
Узнайте, почему FROM выполняется раньше SELECT и как истинный порядок выполнения помогает отвечать на множество каверзных вопросов. Ты практикуешь SQL Interview Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Interview Prep?
Предыдущий опыт не требуется. SQL Interview Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Логический порядок выполнения запроса»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Interview Prep?
Да. Каждый урок SQL Interview Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Что такое SQL и зачем его спрашивают на собеседованиях
- Логический порядок выполнения запроса
- Первичные и внешние ключи и ограничения
- Чтение схемы в условиях стресса