Wszystkie te są funkcjonalnie równoważne. Nawet oddzielenie klauzuli WHERE od warunku JOIN nie zmieni wyników podczas pracy w całości ze złączeniami INNER (może to mieć znaczenie w przypadku złączeń OUTER). Ponadto wszystkie z nich powinny działać w dokładnie tym samym planie zapytań (efektywnie zerowa różnica wydajności). Kolejność, w jakiej umieszczasz elementy nie ma znaczenia . Silnik zapytań może dowolnie optymalizować, ponieważ najlepiej pasuje do specyfikacji funkcjonalnej zapytania. Nawet jeśli zidentyfikujesz określone zachowanie w odniesieniu do porządku, nie powinieneś na to liczyć. Specyfikacja pozwala, aby jutrzejsza łatka zmieniła dzisiejsze zachowanie w tym zakresie. Pamiętaj:cały sens SQL ma być oparty na zbiorach i deklaratywny :mówisz bazie danych co chcesz, a nie jak chcesz, żeby to zrobił.
Teraz, gdy poprawność i wydajność zostały usunięte, sprowadzamy się do kwestii stylu:rzeczy takich jak produktywność programisty i czytelność/utrzymanie kodu. W związku z tym opcja nr 4 na tej liście to zdecydowanie najlepszy wybór, z #3 kolejnym najlepszym wyborem, zwłaszcza gdy zaczynasz wchodzić w bardziej skomplikowane zapytania. Tylko nie używaj A,B
składnia już; jest przestarzały od wersji standardu SQL z 1992 roku. Zawsze wypisuj pełne INNER JOIN
(lub LEFT JOIN
/RIGHT JOIN
/CROSS JOIN
itp).
Wszystko to powiedziawszy, chociaż kolejność nie ma (a przynajmniej powinna) mieć znaczenia dla wydajności, uważam, że podczas pisania SQL pomocne jest użycie konwencji, która dyktuje kolejność. Pomaga mi to później zidentyfikować błędy lub fałszywe założenia podczas debugowania i rozwiązywania problemów. Ten ogólny przewodnik, którego staram się przestrzegać, polega na zachowywaniu się tak, jakby kolejność miała znaczenie, a następnie mając to na uwadze, staraj się, aby zestaw roboczy pamięci potrzebny bazie danych do wypełnienia zapytania był jak najmniejszy, tak długo, jak to możliwe:zacznij od mniejszych stołów, a następnie dołącz do większych; rozważając rozmiar tabeli, weź pod uwagę warunki w klauzuli WHERE, które pasują do indeksu; preferuj połączenia wewnętrzne przed zewnętrznymi, gdy masz wybór; wymień warunki łączenia, aby najpierw faworyzować indeksy (zwłaszcza klucze podstawowe/klastrowe), a następnie inne warunki przy łączeniu.