Jakýkoli dotaz zahrnující více než jednu tabulku vyžaduje určitou formu přidružení k propojení výsledků z tabulky „A“ s tabulkou „B“. Tradiční (ANSI-89) způsob, jak toho dosáhnout, je:
- Uveďte seznam tabulek zahrnutých do seznamu odděleného čárkami v klauzuli FROM
-
Napište asociaci mezi tabulkami do klauzule WHERE
SELECT * FROM TABLE_A a, TABLE_B b WHERE a.id = b.id
Zde je dotaz přepsaný pomocí syntaxe ANSI-92 JOIN:
SELECT *
FROM TABLE_A a
JOIN TABLE_B b ON b.id = a.id
Z hlediska výkonu:
Tam, kde jsou podporovány (Oracle 9i+, PostgreSQL 7.2+, MySQL 3.23+, SQL Server 2000+), neexistuje žádná výkonnostní výhoda při použití jedné syntaxe oproti druhé. Optimalizátor je vidí jako stejný dotaz. Složitější dotazy však mohou těžit z použití syntaxe ANSI-92:
- Možnost ovládat pořadí JOIN – pořadí, ve kterém jsou tabulky skenovány
- Možnost použít kritéria filtru na stůl před připojením
Z pohledu údržby:
Existuje mnoho důvodů, proč používat syntaxi ANSI-92 JOIN oproti ANSI-89:
- Čitelnější, protože kritéria JOIN jsou oddělená od klauzule WHERE
- Menší pravděpodobnost, že nesplníte kritéria JOIN
- Konzistentní podpora syntaxe pro typy JOIN jiné než INNER, což usnadňuje použití dotazů v jiných databázích
- Klauzule WHERE slouží pouze jako filtrace kartézského součinu spojených tabulek
Z pohledu designu:
Syntaxe ANSI-92 JOIN je vzor, nikoli anti-vzor:
- Účel dotazu je zřejmý; sloupce používané aplikací jsou přehledné
- Řídí se pravidlem modularity o používání striktního psaní, kdykoli je to možné. Explicitní je téměř všeobecně lepší.
Závěr
Kromě známosti a/nebo pohodlí nevidím žádnou výhodu v dalším používání klauzule ANSI-89 WHERE místo syntaxe ANSI-92 JOIN. Někdo by si mohl stěžovat, že syntaxe ANSI-92 je podrobnější, ale právě proto je explicitní. Čím explicitnější, tím snazší je pochopit a udržovat.