Złączenia pełne
Oprócz złączeń lewostronnych i prawostronnych istnieje jeszcze jeden rodzaj złączenia zewnętrznego, a mianowicie złączenie pełne (ang. full join). W przypadku złączeń zewnętrznych i wewnętrznych jedna tabela pełni rolę tabeli nadrzędnej, a druga podrzędnej. Innymi słowy, jedna z nich zawiera dane wymagane, a druga opcjonalne. Oznacza to, że gdy dokonujemy złączenia obu tabel, nie muszą występować wiersze dołączone z tabeli podrzędnej (lub zawierającej opcjonalne dane).
W złączeniu wewnętrznym obie tabele są nadrzędne (lub wymagane). Gdy łączone są dwie tabele, aby dany wiersz pojawił się w wyniku, musi istnieć powiązanie danych z obu kolumn, za pomocą których dokonano złączenia.
W przypadku złączenia pełnego obie tabele pełnią rolę tabeli podrzędnej (lub zawierającej opcjonalne dane). W tej sytuacji, gdy dokonujemy złączenia tabeli A z tabelą B, wyświetlamy 1) wszystkie wiersze z tabeli A, nawet jeśli brak w tabeli B dopasowanych do nich wierszy, a także 2) wszystkie wiersze z tabeli B, nawet jeśli nie został do nich dopasowany żaden wiersz z tabeli A.
RÓŻNICE W RAMACH INNYCH BAZ DANYCH: MySQL
W odróżnieniu od Microsoft SQL Server i Oracle, w MySQL nie istnieją złączenia pełne. Przyjrzyjmy się teraz przykładowi złączenia dwóch tabel. Pierwszą z nich będzie tabela Filmy:
IDFilmu | TytułFilmu | Klasyfikacja |
1 | To właśnie miłość | R |
2 | Północ – północny zachód | brak kategorii |
3 | Miłość i śmierć | PG |
4 | Truman Show | PG |
5 | Taka miłość się nie zdarza | R |
6 | Do diabła z miłością | PG-13 |
7 | Gdzie jest Nemo? | G |
Druga tabela to KlasyfikacjaFilmów z opisem klasyfikacji podanym przez Amerykańskie Stowarzyszenie Przemysłu Filmowego (ang. Motion Picture Association of America).
IDKlasyfikacji | Klasyfikacja | OpisKlasyfikacji |
1 | G | Dozwolony dla wszystkich grup wiekowych |
2 | PG | Wskazany nadzór rodzica/rodziców |
3 | PG-13 | Szczególnie wskazany nadzór rodzica/rodziców |
4 | R | Film można obejrzeć jedynie z rodzicami |
5 | NC-17 | Film jedynie dla osób powyżej 17. roku życia |
Tabela Filmy zawiera listę filmów oraz ich klasyfikację według Amerykańskiego Stowarzyszenia Przemysłu Filmowego. Tabela KlasyfikacjaFilmów zawiera listę klasyfikacji wraz z ich opisami. Powiedzmy, że chcemy wyświetlić wszystkie wiersze uzyskane w wyniku złączenia obu tabel. Do tego celu, a więc do wyświetlenia wszystkich wierszy z tabeli Filmy oraz KlasyfikacjaFilmów, użyjemy klauzuli FULL JOIN. Dzięki złączeniu pełnemu otrzymamy wszystkie wiersze z obu tych tabel, nawet jeśli niektóre wiersze z jednej tabeli nie znalazły dopasowania w drugiej. Instrukcja SELECT będzie zatem miała następującą postać:
SELECT
OpisKlasyfikacji AS 'Opis klasyfikacji filmu',
TytułFilmu AS 'Tytuł filmu'
FROM Filmy
FULL JOIN KlasyfikacjaFilmów
ON Filmy.Klasyfikacja = KlasyfikacjaFilmów.Klasyfikacja
ORDER BY OpisKlasyfikacji, TytułFilmu
a jej wynik to:
Opis klasyfikacji filmu | Tytuł filmu |
NULL | Północ – północny zachód |
Dozwolony dla wszystkich grup wiekowych | Gdzie jest Nemo? |
Film jedynie dla osób powyżej 17. roku życia | NULL |
Film można obejrzeć jedynie z rodzicami | Taka miłość się nie zdarza |
Film można obejrzeć jedynie z rodzicami | To właśnie miłość |
Szczególnie wskazany nadzór rodzica/rodziców | Do diabła z miłością |
Wskazany nadzór rodzica/rodziców | Miłość i śmierć |
Wskazany nadzór rodzica/rodziców | Truman Show |
Zauważ, że w wyniku występują dwie puste komórki, co jest bezpośrednim skutkiem zastosowania klauzuli FULL JOIN. Jeśli chodzi o wartość NULL w kolumnie Opis klasyfikacji filmu w przypadku filmu Północ – północny zachód, wynika ona z braku dopasowania wiersza dla tej produkcji filmowej w tabeli KlasyfikacjaFilmów. W przypadku drugiej komórki z wartością NULL żaden film nie został przypisany do kategorii „Film jedynie dla osób powyżej 17. roku życia”, ponieważ w tabeli Filmy nie zostały znalezione żadne wiersze pasujące do tej klasyfikacji.
Zwróć ponadto uwagę na to, że w powyższej instrukcji nie zastosowaliśmy aliasów ani w stosunku do nazw tabel, ani też w odniesieniu do nazw kolumn wymienionych na liście_kolumn. Znalazła się na niej na przykład kolumna TytułFilmu bez wskazania nazwy tabeli, z której pochodzi (Filmy.TytułFilmu). Takie podejście było możliwe z uwagi na fakt, że każda z kolumn wymienionych w naszej instrukcji SELECT znajduje się tylko w jednej tabeli. Nie ma więc potrzeby wskazywania dodatkowo jej nazwy w połączeniu z nazwą kolumny.
W praktyce złączenie pełne jest rzadko stosowane z prostej przyczyny — ten typ relacji między tabelami występuje raczej sporadycznie. Jego celem jest wyświetlenie danych, w przypadku których istnieją niedopasowane wiersze w obu łączonych tabelach. Zazwyczaj będziemy jednak zainteresowani wyświetleniem wyłącznie tych danych, w przypadku których występuje pełne dopasowanie wierszy z obu łączonych tabel (złączenie wewnętrzne) bądź dopasowanie jednostronne (złączenie lewostronne lub prawostronne).
Język SQL. Przyjazny podręcznik. Wydanie II Autor: Larry Rockoff Wydawnictwo: Helion