← Все вопросы

В каком порядке выполняется SELECT-запрос на самом деле?

Задан 13 месяцев назад1.3к просмотров3 ответа
20

Пишу SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY, но слышал, что выполняется это не сверху вниз. Какой реальный порядок и почему это важно знать?

3 ответа

29

Да, пишем мы в одном порядке, а СУБД выполняет в другом. Логический порядок такой:

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

Почему это важно на практике:

  • В WHERE нельзя использовать COUNT(*) — агрегаты считаются позже, поэтому фильтр по ним идёт в HAVING.
  • Псевдоним из SELECT (SELECT amount*2 AS total) часто нельзя использовать в WHERE, но МОЖНО в ORDER BY — потому что ORDER BY выполняется после SELECT, а WHERE до него.

Когда держишь этот порядок в голове, половина «странных» ошибок SQL перестаёт быть странными.

Евгений Ссссссссссссссссс сохранил себе этот список, спасибо · 13 месяцев назад
Валерия Васильева так вот почему алиас в WHERE не виден, а в ORDER BY виден! огонь 🔥 · 13 месяцев назад
11

FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT.

-4

Порядок не важен, СУБД сама оптимизирует как ей удобно.

Данил Григорьев физически — да, оптимизатор переставляет; но ЛОГИЧЕСКИЙ порядок именно такой, и он объясняет, где какой алиас/агрегат доступен · 13 месяцев назад

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект