SQL не имеет порядка выполнения. Это декларативный язык. Оптимизатор может выбрать любой заказ, который он считает подходящим для обеспечения наилучшего времени исполнения. При любом запросе SQL никто не может притвориться, что знает порядок выполнения. Если вы добавите подробную информацию об используемой схеме (точное определение таблиц и индексов) и предполагаемую мощность (размер данных и селективность ключей), тогда можно получить догадку в вероятном порядке выполнения.
В конечном счете, единственный правильный «порядок» - это тот, который описан в фактическом плане выполнения. См. Отображение планов выполнения с использованием классов событий SQL Server Profiler и Отображение графических планов выполнения (SQL Server Management Studio) .
Совершенно иная вещь - как запросы, подзапросы и выражения проецируют себя в 'validity'. Например, если у вас есть псевдоним в списке проекции SELECT, можете ли вы использовать псевдоним в предложении WHERE? Как это:
SELECT a+b as c
FROM t
WHERE c=...;
Допустимо ли использование псевдонима c
в предложении where? Ответ - нет. Запросы формируют синтаксическое дерево, и нижняя ветвь дерева не может быть ссылкой на что-то определенное выше в дереве. Это не обязательно порядок «исполнения», это скорее проблема синтаксического разбора. Это эквивалентно написанию этого кода на C #:
void Select (int a, int b)
{
if (c = ...) then {...}
int c = a+b;
}
Так же, как в C #, этот код не будет компилироваться, так как переменная c
используется до того, как определена, вышеупомянутый SELECT не будет компилироваться должным образом, потому что на псевдоним c
в дереве ссылаются ниже, чем фактически определено.
К сожалению, в отличие от хорошо известных правил синтаксического анализа языка C / C #, правила SQL о том, как строится дерево запросов, несколько эзотеричны. Они кратко упоминаются в Обработка единого оператора SQL , но подробно обсуждается, как они создаются, а какой порядок действителен, а какой нет, я не знаю ни одного источника. Я не говорю, что нет хороших источников, я уверен, что некоторые из хороших книг по SQL освещают эту тему.
Обратите внимание, что порядок синтаксического дерева не соответствует визуальному порядку текста SQL. Например, предложение ORDER BY обычно является последним в тексте SQL, но как синтаксическое дерево оно располагается над всем остальным (сортирует output в SELECT, поэтому оно находится, так сказать, над столбцами SELECTed). ) и как таковой является действительным для ссылки на c
псевдоним:
SELECT a+b as c
FROM t
ORDER BY c;
Обновлено
На самом деле это так: Порядок логической обработки оператора SELECT
Следующие шаги показывают логическое
заказ на обработку или обязательный заказ,
для оператора SELECT. Этот заказ
определяет, когда объекты, определенные в
один шаг сделан доступным для
пункты в последующих шагах. За
Например, если обработчик запросов может
привязка (доступ) к таблицам или представлениям
определенные в предложении FROM, эти
объекты и их столбцы сделаны
доступно для всех последующих шагов.
И наоборот, потому что предложение SELECT
это шаг 8, любые псевдонимы столбцов или
производные столбцы, определенные в этом пункте
не может быть ссылка на предыдущий
статьи. Тем не менее, они могут быть
ссылки на последующие пункты, такие как
как предложение ORDER BY. Обратите внимание, что
фактическое физическое исполнение
утверждение определяется запросом
процессор и порядок могут отличаться от
этот список.
- FROM
- ON
- ГДЕ
- GROUP BY
- С КУБОМ или С РОЛЛАПОМ
- HAVING
- SELECT
- DISTINCT
- ЗАКАЗАТЬ ПО
- TOP