Vysvětlení konceptů a syntaxe spojení

Dokončeno

Nejzákladnější a nejběžnější metodou kombinování dat z více tabulek je použití operace JOIN. Někteří lidé si myslí, že JOIN jako samostatná klauzule v příkazu SELECT, ale jiné si to myslí jako součást klauzule FROM. Tento modul se bude zabývat hlavně jeho součástí klauzule FROM. V tomto modulu zjistíme, jak klauzule FROM v příkazu T-SQL SELECT vytvoří zprostředkující virtuální tabulky, které budou využívat pozdější fáze dotazu.

Klauzule FROM a virtuální tabulky

Pokud jste se dozvěděli o logickém pořadí operací, které se provádějí při zpracování dotazu SQL Serverem, viděli jste, že klauzule FROM příkazu SELECT je první klauzulí, která se má zpracovat. Tato klauzule určuje, která tabulka nebo tabulky budou zdrojem řádků dotazu. Funkce FROM může odkazovat na jednu tabulku nebo spojit více tabulek jako zdroj dat pro váš dotaz. Klauzuli FROM si můžete představit jako vytvoření a naplnění virtuální tabulky. Tato virtuální tabulka bude obsahovat výstup klauzule FROM a bude použita klauzulemi příkazu SELECT, které se použijí později, například klauzule WHERE. Když do klauzule FROM přidáte další funkce, jako jsou operátory spojení, bude užitečné si představit účel prvků klauzule FROM jako přidání řádků do virtuální tabulky nebo jejich odebrání.

Virtuální tabulka vytvořená klauzulí FROM je pouze logická entita. V SYSTÉMU SQL Server se nevytvořila žádná fyzická tabulka, ať už trvalá nebo dočasná, aby byla uložena výsledky klauzule FROM, protože je předána klauzuli WHERE nebo jiným částem dotazu.

Virtuální tabulka vytvořená klauzulí FROM obsahuje data ze všech spojených tabulek. Výsledky si můžete představit jako sady a pojmete výsledky spojení jako Vennův diagram.

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

V průběhu své historie jazyk T-SQL se rozšířil tak, aby odrážel změny v amerických standardech ANSI (National Standards Institute) pro jazyk SQL. Jedním z nejvýznamnějších míst, kde jsou tyto změny viditelné, je syntaxe spojení v klauzuli FROM. Ve standardu ANSI SQL-89 byly spojení zadána zahrnutím více tabulek v klauzuli FROM do seznamu odděleného čárkami. Jakékoli filtrování, které určuje, které řádky se mají zahrnout do klauzule WHERE, například takto:

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;

Sql Server tuto syntaxi stále podporuje, ale kvůli složitosti reprezentace filtrů pro komplexní spojení se nedoporučuje. Pokud je klauzule WHERE omylem vynechána, můžou se spojení ve stylu ANSI SQL-89 snadno stát kartézským produkty a vrátit nadměrný počet výsledných řádků, což způsobuje problémy s výkonem a pravděpodobně nesprávné výsledky.

Při získávání informací o psaní dotazů s více tabulkami v T-SQL je důležité pochopit koncept kartézských produktů. V matematice je kartézský součin dvou množin. Součin sady dvou prvků a množina šesti prvků je sada 12 prvků nebo 6 x 2. Každý prvek v jedné sadě se zkombinuje s každým prvkem v druhé sadě. V následujícím příkladu máme sadu názvů se dvěma prvky a sadou produktů se třemi prvky. Kartézský produkt kombinuje každý název s každým produktem, který přináší šest prvků.

Cartesian product

V databázích je kartézský součin výsledkem kombinování každého řádku v jedné tabulce do každého řádku jiné tabulky. Součin tabulky s 10 řádky a tabulkou s 100 řádky je sada výsledků s 1 000 řádky. Základním výsledkem operace JOIN je kartézský produkt, ale u většiny dotazů T-SQL není požadovaným výsledkem kartézský produkt. V jazyce T-SQL dojde k kartézskému produktu, když jsou dvě vstupní tabulky spojené, aniž by bylo nutné zvážit relace mezi nimi. Bez informací o relacích vrátí procesor dotazů SQL Serveru všechny možné kombinace řádků. I když tento výsledek může mít některé praktické aplikace, jako je generování testovacích dat, není obvykle užitečné a může mít závažný dopad na výkon.

Po nástupu standardu ANSI SQL-92 byla přidána podpora klíčových slov JOIN a ON klauzulí. T-SQL podporuje také tuto syntaxi. Spojení jsou reprezentována v klauzuli FROM pomocí příslušného operátoru JOIN. Logická relace mezi tabulkami, která se stane predikátem filtru, je určena v klauzuli ON.

Následující příklad restuje předchozí dotaz s novější syntaxí:

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;

Poznámka:

Syntaxe ANSI SQL-92 znesnadňuje vytváření náhodných kartézských produktů. Po přidání klíčového slova JOIN se v případě chybějící klauzule ON vyvolá syntaktická chyba, pokud není funkce JOIN určena jako KŘÍŽOVÉ SPOJENÍ.