/ZłączeniaWewnętrzne

Z Brain-wiki

TI:WTBD/ZłączeniaWewnętrzne

W ogólniejszym poleceniu SELECT źródłem danych może być złączenie 2 lub więcej tabel -- tzn. może ono występować w klauzuli FROM zamiast nazwy pojedynczej tabeli. Jest parę różnych sposobów jego zapisania.

Złączenie wewnętrzne

  • tabela1, tabela2 WHERE warunek_złączenia
  • tabela1 JOIN tabela2 WHERE warunek_złączenia
  • tabela1 INNER JOIN tabela2 WHERE warunek_złączenia
  • tabela1 CROSS JOIN tabela2 WHERE warunek_złączenia

Każdy z tych zapisów w zasadzie oznacza to samo, mianowicie iloczyn kartezjański tabela1 x tabela2 ograniczony do podzbioru wierszy spełniających warunek_złączenia. Ale np. użycie CROSS JOIN w przypadku SQLite zabrania optymalizatorowi zapytań zamiany kolejności tabel (nie ma to wpływu na wynik, tylko na procedurę jego uzyskania).

Dla takich jak wyżej złączeń (tzn. wewnętrznych) istnieje też składnia pozwalająca zapisać warunek złączenia w odrębnej klauzuli ON (zamiast w klauzuli WHERE), tzn.:

  • tabela1 JOIN tabela2 ON warunek_złączenia [JOIN tabela3 ON kolejny_warunek ...]

semantycznie jest to to samo, niektóre produkty mogą (nie jestem tego pewien) traktować takie klauzule inaczej przy optymalizacji. Korzyść może być głównie dla czytelności zapisu: można wyodrębnić warunki złączenia (tzn. te, które wynikają z powiązań między tabelami) od warunków, służących selekcji interesujących nas danych -- pozostawiając te ostatnie w klauzuli WHERE. Dodatkowo, w przypadku złączeń wielokrotnych, pozwala to umieścić warunki łączące blisko odwołań to tabel, do których one się odnoszą -- co również może sprzyjać czytelności.

Aliasy

Podając odniesienie do tabeli w klauzuli FROM można zarazem określić dla niej alias:

  • baza1.tabela_o_długiej_nazwie [AS] alias, ...

(słowo AS jest opcjonalne). Służy to temu, by nie musieć wielokrotnie korzystać z (być może długiej) nazwy tabeli przy kwalifikowaniu nazw kolumn w wyrażeniach po SELECT i warunkach.

Podobnie można wprowadzić aliasy dla wyrażeń określających kolumny tabeli wynikowej. Ich zastosowanie jest jednak dość ograniczone.