Stosowanie instrukcji warunkowych w ON / WHERE
Wyjaśniłem tutaj logiczne kroki przetwarzania zapytania.
Odniesienie: Wewnątrz Microsoft® SQL Server ™ 2005
Kwerenda T-SQL
Wydawca: Microsoft Press
Pub Data: 07 marca 2006
Drukuj ISBN-10: 0-7356-2313-9
Drukuj ISBN-13: 978-0-7356-2313-2
Strony: 640
Wewnątrz kwerendy T-SQL Microsoft® SQL Server ™ 2005
(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>
Pierwszym zauważalnym aspektem SQL innym niż inne języki programowania jest kolejność przetwarzania kodu. W większości języków programowania kod jest przetwarzany w kolejności, w jakiej został napisany. W SQL pierwszą przetwarzaną klauzulą jest klauzula FROM, a klauzula SELECT, która pojawia się jako pierwsza, jest przetwarzana prawie na końcu.
Każdy krok generuje wirtualną tabelę, która jest używana jako dane wejściowe do następnego kroku. Te tabele wirtualne nie są dostępne dla osoby dzwoniącej (aplikacja kliencka lub zapytanie zewnętrzne). Tylko tabela wygenerowana przez ostatni krok jest zwracana do osoby dzwoniącej. Jeśli w zapytaniu nie podano określonej klauzuli, odpowiedni krok jest po prostu pomijany.
Krótki opis faz logicznego przetwarzania zapytania
Nie przejmuj się zbytnio, jeśli opis kroków wydaje się na razie bez sensu. Są one podane jako odniesienie. Sekcje, które pojawiają się po przykładzie scenariusza, będą omawiać kroki bardziej szczegółowo.
FROM: Produkt kartezjański (łączenie krzyżowe) jest wykonywany między dwiema pierwszymi tabelami w klauzuli FROM, w wyniku czego generowana jest wirtualna tabela VT1.
WŁ .: Filtr WŁ. Jest stosowany do VT1. Tylko wiersze, dla których <join_condition>
jest PRAWDA, są wstawiane do VT2.
ZEWNĘTRZNE (złączenie): Jeśli określono ZŁĄCZE ZEWNĘTRZNE (w przeciwieństwie do ZŁĄCZA KRZYŻOWEGO lub DOŁĄCZENIA WEWNĘTRZNEGO), wiersze z zachowanej tabeli lub tabel, dla których nie znaleziono dopasowania, są dodawane do wierszy z VT2 jako wiersze zewnętrzne, generując VT3. Jeśli w klauzuli FROM pojawiają się więcej niż dwie tabele, kroki od 1 do 3 są powtarzane między wynikiem ostatniego łączenia i następnej tabeli w klauzuli FROM, aż wszystkie tabele zostaną przetworzone.
GDZIE: Filtr WHERE jest stosowany do VT3. Tylko wiersze, dla których <where_condition>
jest PRAWDA, są wstawiane do VT4.
GROUP BY: Wiersze z VT4 są ułożone w grupy na podstawie listy kolumn określonej w klauzuli GROUP BY. Generowane jest VT5.
CUBE | ROLLUP: Supergrupy (grupy grup) są dodawane do wierszy z VT5, generując VT6.
HAVING: Filtr HAVING jest stosowany do VT6. Tylko grupy, dla których <having_condition>
jest PRAWDA, są wstawiane do VT7.
SELECT: Lista SELECT jest przetwarzana, generując VT8.
ODRÓŻNIJ: Zduplikowane wiersze są usuwane z VT8. VT9 jest generowany.
ORDER BY: Wiersze z VT9 są sortowane zgodnie z listą kolumn określoną w klauzuli ORDER BY. Generowany jest kursor (VC10).
TOP: Określona liczba lub procent wierszy jest wybierana od początku VC10. Tabela VT11 jest generowana i zwracana do osoby dzwoniącej.
Dlatego funkcja (WEJŚCIE DO WEJŚCIA) przefiltruje dane (sama liczba danych VT zostanie tutaj zmniejszona) przed zastosowaniem klauzuli WHERE. Kolejne warunki łączenia zostaną wykonane z przefiltrowanymi danymi, co poprawi wydajność. Następnie tylko warunek GDZIE zastosuje warunki filtru.
(Zastosowanie instrukcji warunkowych w ON / WHERE nie zrobi dużej różnicy w kilku przypadkach. Zależy to od liczby połączonych tabel i liczby wierszy dostępnych w każdej tabeli łączenia)