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