Reklama
Wizyt
Dzisiaj: 288Wszystkich: 520565

Łączenie tabel

Technikum » SBD » SQL » Łączenie tabel

Omawiane do tej pory zapytania dotyczyły pojedynczych tabel, istotą relacyjnych baz danych jest odwoływanie się w zapytaniach do wielu powiązanych ze sobą tabel. Połączenia realizowane są przez porównanie wartości kolumny lub kilku kolumn z jednej tabeli z podobnymi kolumnami z drugiej tabeli.
Połączenia są najważniejszym mechanizmem relacyjnych baz danych. Dzięki nim możemy wybierać pasujące do siebie dane z wielu tabel, tworzyć raporty i podsumowania danych pochodzących z wielu tabel. Poprawne tworzenie połączeń jest podstawą projektowania i tworzenia profesjonalnych systemów baz danych.
Połączenia są realizowane między kluczem podstawowym jednej tabeli i kluczem obcym drugiej. Klucz obcy jest kolumną lub kombinacją kolumn, które są kluczem podstawowym w innej tabeli.
Wartości klucza podstawowego są niepowtarzalne, natomiast w kolumnie klucza obcego każda z wartości może powtórzyć się wielokrotnie. Wtedy tworzone powiązanie jest związkiem typu jeden do wielu.

 

Połączenie wewnętrzne i zewnętrzne


W języku SQL połączenie między tabelami jest definiowane w sekcji FROM zapytania. Połączenie między tabelami definiuje słowo kluczowe INNER JOIN. Klauzula realizująca połączenie ma postać:


          tabela1 INNER JOIN tabela2
          ON tabela1.kolumna1= tabela2.kolumna2


Przykład

Mamy prześledzić historię zamówień w księgarni internetowej w czerwcu 2012 roku. Wynikiem zapytania ma być nazwisko i imię klienta, data złożenia zamówienia, liczba zamówionych egzemplarzy książki oraz tytuł i nazwisko autora książki.




Aby prawidłowo utworzyć zapytanie, należy zdefiniować połączenia między tabelami bazy danych. Definicji połączeń można używać wielokrotnie, chociaż może to wpłynąć na szybkość działania zapytania.
Przedstawione w przykładzie połączenie jest połączeniem wewnętrznym (INNER JOIN). Oznacza to, że wynikiem zapytania są tylko wiersze zawierające w polu klucza podstawowego i w polu klucza obcego pasujące do siebie dane. Połączenie wewnętrzne jest domyślnym typem połączenia.

Innym rodzajem połączenia jest połączenie zewnętrzne (OUTER JOIN). Przy takim połączeniu wynikiem zapytania są wszystkie wiersze w jednej tabeli i pasujące do nich wiersze z drugiej tabeli.


Złączenia zewnętrzne dzielimy na:

  • LEFT OUTER JOIN — zapytanie zwraca wszystkie wiersze z pierwszej tabeli i pasujące wiersze z drugiej tabeli;
  • RIGHT OUTER JOIN — zapytanie zwraca wszystkie wiersze z drugiej tabeli i pasujące wiersze z pierwszej tabeli;
  • FULL OUTER JOIN — zapytanie zwraca wszystkie pasujące i niepasujące wiersze z obu tabel.


Gdybyśmy chcieli uzyskać listę wszystkich zamówień zrealizowanych w księgarni internetowej wraz z numerami wystawionych faktur, to przy zastosowaniu domyślnego połączenia między tabelami (INNER JOIN) nie uzyskalibyśmy informacji o zamówieniach, dla których nie wystawiono faktury.
Jeżeli zastosujemy połączenie zewnętrzne, otrzymamy wszystkie wiersze z tabeli Zamowienia oraz numery faktur dla zamówień, dla których faktury zostały wystawione.


Przykład


Tak jak lewostronne połączenie zewnętrzne (LEFT OUTER JOIN) zwraca wszystkie wiersze z lewej tabeli, tak prawostronne połączenie zewnętrzne (RIGHT OUTER JOIN) zwraca wszystkie wiersze z prawej tabeli. Zmieniając kolejność tabel w klauzuli FROM, można zastąpić połączenie lewostronne połączeniem prawostronnym.

Połączenie zewnętrzne obustronne (FULL OUTER JOIN) zwraca wszystkie wiersze obu połączonych tabel, również te, które nie spełniają warunku połączenia.



Przykład

Jeżeli przyjmiemy, że w tabeli Zamowienia znajdują się zamówienia, dla których nie zostały wystawione faktury, a w tabeli Faktury znajdują się informacje o fakturach, które nie są powiązane z żadnym zamówieniem, to zapytanie, które wyświetli informację o wszystkich zamówieniach i fakturach, będzie miało postać:

 

Potączenie krzyżowe


Wszystkie możliwe połączenia wierszy dwóch tabel nazywamy iloczynem kartezjańskim lub połączeniem krzyżowym (CROSS JOIN). W tego typu połączeniu nie określa się warunku połączenia. Połączeniem krzyżowym można połączyć dowolne dwie tabele. Wynik tak zaprojektowanego zapytania dla tabel o pięciu i dziesięciu wierszach to tabela o 50 wierszach. Przy większej liczbie wierszy w tabelach wynik może być bardzo duży.
Tego typu połączenia są rzadko stosowane w relacyjnych bazach danych.

 

Przykład

 

Połączenia wielokrotne


Projektując zapytanie, możemy definiować w nim dowolną liczbę połączeń między tabelami. Maksymalna liczba dopuszczalnych połączeń zależy od serwera bazodanowego. Przy ich definiowaniu należy pamiętać, że dołączenie w zapytaniu każdej następnej tabeli powoduje zmniejszenie wydajności zapytania. Mechanizm obsługiwania przez serwer zapytań zawierających zdefiniowane połączenie między tabelami działa tak, że zawsze łączone są dwie tabele. Po połączeniu dwóch pierwszych tabel powstaje struktura pośrednia, która jest łączona z kolejną tabelą i tworzona jest kolejna struktura pośrednia. Tworzenie struktur pośrednich trwa aż do połączenia wszystkich tabel.

 

Złączenie tabeli z nią samą


Złączenie tabeli z nią samą jest definiowane w podobny sposób jak połączenia różnych tabel. Przy łączeniu tej samej tabeli, jej nazwy w klauzuli FROM byłyby takie same. Aby odróżnić je od siebie, należy nadać im nowe nazwy (aliasy).


Przykład

 

Ponieważ w obu wirtualnych tabelach istnieją kolumny nazwisko i imie, nazwy te są niejednoznaczne i muszą być poprzedzone nazwą tabeli.
Taki sposób połączenia tabeli z nią samą może zostać wykorzystany do wykrycia klientów, którzy zarejestrowali się w bazie danych kilkakrotnie.


Przykład

 

Reklama