Применение условных операторов в положение ON/WHERE
Здесь я рассказал о логических шагов обработки запросов.
Ссылка: Внутрь Microsoft® SQL Server ™ 2005 T-SQL Запросы
Издатель: Microsoft Press
Pub Дата: 7 марта 2006
Печать ISBN-10: 0-7356-2313-9
Печать ISBN-13: 978-0-7356-2313-2
Страницы: 640
Inside Microsoft® SQL Server™ 2005 T-SQL Querying
(8) SELECT (9) DISTINCT (11) TOP <top_specification> <select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) WITH {CUBE | ROLLUP}
(7) HAVING <having_condition>
(10) ORDER BY <order_by_list>
Первым заметным аспектом SQL, который отличается от других языков программирования, является порядок обработки кода. В большинстве языков программирования код обрабатывается в том порядке, в котором он написан. В SQL первое обрабатываемое предложение - это предложение FROM, в то время как предложение SELECT, которое появляется первым, обрабатывается почти последним.
Каждый шаг генерирует виртуальную таблицу, которая используется в качестве входного сигнала для следующего шага. Эти виртуальные таблицы недоступны для вызывающего (клиентского приложения или внешнего запроса). Конечной стороне возвращается только таблица, сгенерированная на последнем шаге. Если определенное условие не указано в запросе, соответствующий шаг просто пропущен.
Краткое описание логических Этапы обработки запроса
Не беспокойтесь слишком много, если описание шагов, кажется, не имеет смысла сейчас. Они приведены в качестве ссылки. Разделы, которые появляются после примера сценария, будут более подробно описаны в шагах.
ОТ: декартово произведение (перекрестное соединение) выполняются между первыми двумя столами в ЕКЕ, и, как следствие, виртуальная таблица VT1 генерируется.
ON: Фильтр ON применяется к VT1. Только строки, для которых <join_condition>
TRUE, вставлены в VT2.
OUTER (join): Если указан OUTER JOIN (в отличие от CROSS JOIN или INNER JOIN), строки из сохраненной таблицы или таблиц, для которых совпадение не было найдено, добавляются в строки из VT2 как внешние строки, генерирующие VT3. Если в предложении FROM указано более двух таблиц, шаги 1 - 3 применяются повторно между результатом последнего соединения и следующей таблицей в предложении FROM до тех пор, пока не будут обработаны все таблицы.
ГДЕ: Фильтр WHERE применяется к VT3. Только строки, для которых значение <where_condition>
TRUE, вставляются в VT4.
GROUP BY: Строки из VT4 расположены группами в зависимости от списка столбцов, указанного в предложении GROUP BY. VT5 генерируется.
CUBE | ROLLUP: Супергруппы (группы групп) добавляются к строкам из VT5, генерируя VT6.
HAVING: Фильтр HAVING применяется к VT6. В VT7 вставляются только группы, для которых значение <having_condition>
TRUE.
SELECT: список SELECT обрабатывается, генерируя VT8.
DISTINCT: Дублированные строки удаляются из VT8. Генерируется VT9.
ORDER BY: Строки из VT9 сортируются в соответствии с списком столбцов, указанным в предложении ORDER BY. Создается курсор (VC10).
TOP: указанное число или процент строк выбирается с начала VC10. Таблица VT11 генерируется и возвращается вызывающему абоненту.
Таким образом, (INNER JOIN) ПО будет фильтровать данные (данные счета ВТ будет снижена здесь сам по себе) перед применением ИНЕКЕ. Последующие условия соединения будут выполняться с отфильтрованными данными, что улучшает производительность. После этого условие WHERE будет применяться только к условиям фильтра.
(. Применение условных операторов в положении ON/WHERE не будет делать большую разницы в некоторых случаях это зависит, сколько столов вы присоединились и количество строк доступно в каждом объединении таблиц)
@bendin: FYI ссылка Предоставлена сломана! –
@Marco: [здесь это] (http://www.se-radio.net/2009/06/episode-137-sql-with-jim-melton/) –
Возможный дубликат [SQL left join vs multiple tables на строке FROM?] (http://stackoverflow.com/questions/894490/sql-left-join-vs-multiple-tables-on-from-line) –