Każde zapytanie obejmujące więcej niż jedną tabelę wymaga jakiejś formy powiązania w celu połączenia wyników z tabeli „A” z tabelą „B”. Tradycyjnym sposobem (ANSI-89) jest:
- Wymień tabele biorące udział w liście oddzielonej przecinkami w klauzuli FROM
-
Zapisz powiązanie między tabelami w klauzuli WHERE
SELECT * FROM TABLE_A a, TABLE_B b WHERE a.id = b.id
Oto zapytanie przepisane przy użyciu składni ANSI-92 JOIN:
SELECT *
FROM TABLE_A a
JOIN TABLE_B b ON b.id = a.id
Z perspektywy wydajności:
Tam, gdzie jest obsługiwana (Oracle 9i+, PostgreSQL 7.2+, MySQL 3.23+, SQL Server 2000+), użycie którejkolwiek składni nie przynosi korzyści pod względem wydajności. Optymalizator widzi je jako to samo zapytanie. Jednak bardziej złożone zapytania mogą skorzystać na użyciu składni ANSI-92:
- Możliwość kontrolowania kolejności JOIN - kolejności, w jakiej tabele są skanowane
- Możliwość zastosowania kryteriów filtrowania na stole przed dołączeniem
Z perspektywy konserwacji:
Istnieje wiele powodów, dla których warto używać składni ANSI-92 JOIN zamiast ANSI-89:
- Bardziej czytelne, ponieważ kryteria JOIN są oddzielone od klauzuli WHERE
- Mniej prawdopodobne jest pominięcie kryteriów JOIN
- Spójna obsługa składni dla typów JOIN innych niż INNER, dzięki czemu zapytania są łatwe w użyciu w innych bazach danych
- Klauzula GDZIE służy tylko jako filtracja iloczynu kartezjańskiego połączonych tabel
Z perspektywy projektowej:
Składnia ANSI-92 JOIN to wzorzec, a nie anty-wzorzec:
- Cel zapytania jest bardziej oczywisty; kolumny używane przez aplikację są jasne
- Jest to zgodne z zasadą modularności dotyczącą używania ścisłego pisania, gdy tylko jest to możliwe. Jawne jest prawie powszechnie lepsze.
Wniosek
Bez znajomości i/lub wygody nie widzę żadnych korzyści z dalszego używania klauzuli ANSI-89 WHERE zamiast składni ANSI-92 JOIN. Niektórzy mogą narzekać, że składnia ANSI-92 jest bardziej gadatliwa, ale to czyni ją wyraźną. Im bardziej jednoznaczne, tym łatwiej je zrozumieć i utrzymać.