Применение условных операторов в ON / WHERE
Здесь я объяснил о шагах обработки логического запроса.
Ссылка: Внутри Microsoft® SQL Server ™ 2005 T-SQL Querying
Издатель: Microsoft Press
Pub Дата: 7 марта 2006 г.
Печать ISBN-10: 0-7356-2313-9
Печать ISBN-13: 978-0-7356-2313-2
Страницы: 640
Внутри Microsoft® SQL Server ™ 2005 T-SQL-запросов
(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, которое появляется первым, обрабатывается почти последним.
Каждый шаг генерирует виртуальную таблицу, которая используется в качестве входных данных для следующего шага. Эти виртуальные таблицы недоступны для вызывающей стороны (клиентское приложение или внешний запрос). Только таблица, созданная на последнем шаге, возвращается вызывающей стороне. Если в запросе не указано определенное предложение, соответствующий шаг просто пропускается.
Краткое описание этапов обработки логических запросов
Не беспокойтесь, если описание шагов пока не имеет особого смысла. Они предоставляются в качестве ссылки. Разделы, которые следуют после примера сценария, будут охватывать шаги более подробно.
FROM: декартово произведение (перекрестное соединение) выполняется между первыми двумя таблицами в предложении FROM, и в результате создается виртуальная таблица VT1.
ON: фильтр ON применяется к VT1. Только строки, для которых <join_condition>
TRUE, вставляются в VT2.
OUTER (соединение): если указано OUTER JOIN (в отличие от CROSS JOIN или INNER JOIN), строки из сохраненной таблицы или таблиц, для которых не найдено совпадение, добавляются в строки из VT2 в качестве внешних строк, генерируя VT3. Если в предложении FROM появляется более двух таблиц, шаги с 1 по 3 применяются повторно между результатом последнего соединения и следующей таблицей в предложении FROM, пока не будут обработаны все таблицы.
ГДЕ: ГДЕ фильтр применяется к VT3. Только строки, для которых <where_condition>
TRUE, вставляются в VT4.
GROUP BY: строки из VT4 упорядочены в группы на основе списка столбцов, указанного в предложении GROUP BY. VT5 генерируется.
КУБ | ROLLUP: супергруппы (группы групп) добавляются в строки из VT5, генерируя VT6.
HAVING: фильтр HAVING применяется к VT6. Только группы, для которых <having_condition>
TRUE, вставляются в VT7.
SELECT: список SELECT обрабатывается, генерируя VT8.
DISTINCT: повторяющиеся строки удаляются из VT8. VT9 генерируется.
ORDER BY: строки из VT9 сортируются в соответствии со списком столбцов, указанным в предложении ORDER BY. Курсор генерируется (VC10).
TOP: указанное количество или процент строк выбирается с начала VC10. Таблица VT11 генерируется и возвращается вызывающей стороне.
Следовательно, (INNER JOIN) ON будет фильтровать данные (количество данных VT будет само здесь уменьшаться) перед применением предложения WHERE. Последующие условия соединения будут выполняться с отфильтрованными данными, что повышает производительность. После этого только условие WHERE будет применять условия фильтра.
(Применение условных операторов в ON / WHERE не будет иметь большого значения в нескольких случаях. Это зависит от количества таблиц, к которым вы присоединились, и количества строк, доступных в каждой из таблиц объединения)