SQL
Порядок исполнения
Поиск…
Логический порядок обработки запросов в SQL
/*(8)*/ SELECT /*9*/ DISTINCT /*11*/ TOP
/*(1)*/ FROM
/*(3)*/ JOIN
/*(2)*/ ON
/*(4)*/ WHERE
/*(5)*/ GROUP BY
/*(6)*/ WITH {CUBE | ROLLUP}
/*(7)*/ HAVING
/*(10)*/ ORDER BY
/*(11)*/ LIMIT
Порядок обработки запроса и описание каждого раздела.
VT обозначает «Виртуальную таблицу» и показывает, как различные данные создаются по мере обработки запроса
FROM: Декартово произведение (кросс-соединение) выполняется между двумя первыми двумя таблицами в предложении FROM, и в результате создается виртуальная таблица VT1.
ON: фильтр ВКЛ применяется к VT1. Только строки, для которых TRUE, вставлены в VT2.
OUTER (join): Если указан OUTER JOIN (в отличие от CROSS JOIN или INNER JOIN), строки из сохраненной таблицы или таблиц, для которых совпадение не было найдено, добавляются к строкам из VT2 в качестве внешних строк, генерируя VT3. Если в предложении FROM указано более двух таблиц, шаги 1 - 3 применяются повторно между результатом последнего соединения и следующей таблицей в предложении FROM до тех пор, пока не будут обработаны все таблицы.
ГДЕ: Фильтр WHERE применяется к VT3. Только строки, для которых TRUE, вставлены в VT4.
GROUP BY: Строки из VT4 расположены в группах на основе списка столбцов, указанного в предложении GROUP BY. VT5 генерируется.
CUBE | ROLLUP: Супергруппы (группы групп) добавляются к строкам из VT5, генерируя VT6.
HAVING: Фильтр HAVING применяется к VT6. Только группы, для которых TRUE, вставлены в VT7.
SELECT: обрабатывается список SELECT, генерирующий VT8.
DISTINCT: Дублированные строки удаляются из VT8. Генерируется VT9.
ORDER BY: строки из VT9 сортируются в соответствии с списком столбцов, указанным в предложении ORDER BY. Создается курсор (VC10).
TOP: указанное число или процент строк выбирается с начала VC10. Таблица VT11 генерируется и возвращается вызывающему абоненту. LIMIT имеет ту же функциональность, что и TOP в некоторых SQL-диалектах, таких как Postgres и Netezza.