Omówienie pojęć i składni sprzężeń

Ukończone

Najbardziej podstawową i typową metodą łączenia danych z wielu tabel jest użycie operacji JOIN. Niektórzy ludzie myślą o JOIN jako osobnej klauzuli w instrukcji SELECT, ale inni uważają ją za część klauzuli FROM. Ten moduł będzie głównie uważać, że jest częścią klauzuli FROM. W tym module dowiemy się, jak klauzula FROM w instrukcji T-SQL SELECT tworzy pośrednie tabele wirtualne, które będą używane przez późniejsze fazy zapytania.

Klauzula FROM i tabele wirtualne

Jeśli znasz logiczną kolejność operacji wykonywanych podczas przetwarzania zapytania przez program SQL Server, zobaczysz, że klauzula FROM instrukcji SELECT jest pierwszą klauzulą do przetworzenia. Ta klauzula określa, która tabela lub tabele będą źródłem wierszy zapytania. Funkcja FROM może odwoływać się do pojedynczej tabeli lub łączyć wiele tabel jako źródło danych dla zapytania. Klauzulę FROM można traktować jako tworzenie i wypełnianie tabeli wirtualnej. Ta tabela wirtualna będzie przechowywać dane wyjściowe klauzuli FROM i będzie używana przez klauzule instrukcji SELECT, które są stosowane później, takie jak klauzula WHERE. W miarę dodawania dodatkowych funkcji, takich jak operatory sprzężenia, do klauzuli FROM warto zastanowić się nad celem elementów klauzuli FROM w celu dodania wierszy do tabeli wirtualnej lub usunięcia wierszy z niej.

Tabela wirtualna utworzona przez klauzulę FROM jest tylko jednostką logiczną. W programie SQL Server nie jest tworzona tabela fizyczna, zarówno trwała, jak i tymczasowa, do przechowywania wyników klauzuli FROM, ponieważ jest przekazywana do klauzuli WHERE lub innych części zapytania.

Tabela wirtualna utworzona przez klauzulę FROM zawiera dane ze wszystkich tabel sprzężonych. Przydatne może być myślenie o wynikach jako zestawach i koncepcyjne tworzenie wyników sprzężenia jako diagramu Venna.

A Venn diagram showing the set of an Employee table joined to a SalesOrder table

W całej swojej historii język T-SQL rozszerzył się w celu odzwierciedlenia zmian w standardach Amerykańskiego Narodowego Instytutu Standardów (ANSI) dla języka SQL. Jednym z najbardziej godnych uwagi miejsc, w których te zmiany są widoczne, jest składnia sprzężeń w klauzuli FROM. W standardzie ANSI SQL-89 sprzężenia zostały określone przez uwzględnienie wielu tabel w klauzuli FROM na liście rozdzielanej przecinkami. Wszelkie filtrowanie w celu określenia, które wiersze do uwzględnienia zostały wykonane w klauzuli WHERE, w następujący sposób:

SELECT p.ProductID, m.Name AS Model, p.Name AS Product
FROM SalesLT.Product AS p, SalesLT.ProductModel AS m
WHERE p.ProductModelID = m.ProductModelID;

Ta składnia jest nadal obsługiwana przez program SQL Server, ale ze względu na złożoność reprezentowania filtrów dla złożonych sprzężeń nie jest zalecana. Ponadto jeśli klauzula WHERE zostanie przypadkowo pominięta, sprzężenia w stylu ANSI SQL-89 mogą łatwo stać się produktami kartezjańskimi i zwrócić nadmierną liczbę wierszy wyników, powodując problemy z wydajnością i ewentualnie niepoprawne wyniki.

Podczas pisania zapytań obejmujących wiele tabel w języku T-SQL ważne jest zrozumienie koncepcji produktów kartezjańskich. W matematyce produkt kartezjański jest produktem dwóch zestawów. Produkt zestawu dwóch elementów i zestaw sześciu elementów jest zestawem 12 elementów lub 6 x 2. Każdy element w jednym zestawie jest połączony z każdym elementem w drugim zestawie. W poniższym przykładzie mamy zestaw nazw z dwoma elementami i zestawem produktów z trzema elementami. Produkt kartezjański łączy każdą nazwę z każdym produktem, który daje sześć elementów.

Cartesian product

W bazach danych produkt kartezjański jest wynikiem połączenia każdego wiersza w jednej tabeli z każdym wierszem innej tabeli. Produkt tabeli z 10 wierszami i tabelą z 100 wierszami jest zestawem wyników z 1000 wierszami. Podstawowym wynikiem operacji JOIN jest produkt kartezjański, ale w przypadku większości zapytań T-SQL produkt kartezjański nie jest pożądanym wynikiem. W języku T-SQL produkt kartezjański występuje, gdy dwie tabele wejściowe są połączone bez uwzględniania żadnych relacji między nimi. Bez informacji o relacjach procesor zapytań programu SQL Server zwróci wszystkie możliwe kombinacje wierszy. Chociaż ten wynik może mieć pewne praktyczne zastosowania, takie jak generowanie danych testowych, zwykle nie jest przydatne i może mieć poważne konsekwencje dla wydajności.

Wraz z pojawieniem się standardu ANSI SQL-92 dodano obsługę słów kluczowych JOIN i ON. Język T-SQL obsługuje również tę składnię. Sprzężenia są reprezentowane w klauzuli FROM przy użyciu odpowiedniego operatora JOIN. Relacja logiczna między tabelami, która staje się predykatem filtru, jest określona w klauzuli ON.

Poniższy przykład umożliwia odtworzenie poprzedniego zapytania przy użyciu nowszej składni:

SELECT p.ProductID, m.Name AS Model, p.Name AS Product
FROM SalesLT.Product AS p
JOIN SalesLT.ProductModel AS m
    ON p.ProductModelID = m.ProductModelID;

Uwaga

Składnia ANSI SQL-92 utrudnia tworzenie przypadkowych produktów kartezjańskich. Po dodaniu słowa kluczowego JOIN zostanie zgłoszony błąd składniowy, jeśli brakuje klauzuli ON, chyba że klauzula JOIN zostanie określona jako CROSS JOIN.