← Все вопросы
В каком порядке выполняется SELECT-запрос на самом деле?
20
Пишу SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY, но слышал, что выполняется это не сверху вниз. Какой реальный порядок и почему это важно знать?
3 ответа
29
Да, пишем мы в одном порядке, а СУБД выполняет в другом. Логический порядок такой:
FROM(иJOIN) — берём и соединяем таблицы.WHERE— фильтруем строки (агрегатов ещё нет).GROUP BY— группируем.HAVING— фильтруем уже группы.SELECT— вычисляем выражения и псевдонимы (AS).ORDER BY— сортируем.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 месяцев назад
Ваш ответ
Войдите, чтобы ответить на вопрос.