Какая последовательность выполнения команд SELECT, FROM, JOIN и WHERE в SQL?

«Какая последовательность выполнения команд SELECT, FROM, JOIN и WHERE в SQL?» — вопрос из категории SQL, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Логический порядок выполнения SQL-запроса (порядок обработки движком) отличается от порядка его написания. Вот последовательность:

  1. FROMJOIN) — сначала определяется исходный набор данных из таблиц и выполняются все соединения.
  2. WHERE — затем происходит фильтрация строк по заданным условиям.
  3. GROUP BY — строки группируются (если указано).
  4. HAVING — фильтруются уже сформированные группы (если указано).
  5. SELECT — выбираются, вычисляются и переименовываются столбцы, включая агрегатные функции.
  6. ORDER BY — результат сортируется.
  7. LIMIT / OFFSET — применяется ограничение на количество возвращаемых строк.

Почему это важно? Например, вы не можете использовать псевдоним столбца из SELECT в условии WHERE, потому что WHERE выполняется раньше, чем SELECT. Алиасы из SELECT доступны только в ORDER BY и HAVING.

Пример, иллюстрирующий порядок:

-- Порядок НАПИСАНИЯ
SELECT 
    d.name AS department,        -- 5. Выбор и переименование
    COUNT(e.id) AS emp_count     -- 5. Агрегация
FROM employees e                 -- 1. Определение таблицы
JOIN departments d ON e.dept_id = d.id -- 1. Соединение
WHERE e.salary > 50000           -- 2. Фильтрация строк
GROUP BY d.name                  -- 3. Группировка
HAVING COUNT(e.id) > 5          -- 4. Фильтрация групп
ORDER BY emp_count DESC          -- 6. Сортировка
LIMIT 10;                        -- 7. Ограничение вывода