Rodzaje JOIN

Ostatnio poznaliśmy sposób łączenia kilku tabel ze sobą za pomocą JOINA jest to skrócona nazwa, ponieważ można na przemienię używać tej klauzuli z INNER JOIN. Jak wskazuję nazwa jest to łączenie wewnętrzne. Więc skoro jest łączenie wewnętrzne to czy są jeszcze jakieś inne? Odpowiedź brzmi TAK.

Opiszemy dzisiaj czym się różnią i kiedy wykorzystujemy poszczególne klauzule łączenia

INNER JOIN

Jest to łączenie które poznaliśmy ostatnio, charakteryzuję się tym, że wypisuję jedynie część wspólną tabel. Tak jak jest to przedstawione na tym obrazku

Teraz przypomnimy sobie zastosowanie INNER JOIN, wykorzystamy do tego dwie zmodyfikowane tabele MASZYNY oraz HALE.

Wyobrazimy sobie, że twój przełożony prosi cię o stworzenie listy wszystkich maszyn jakie posiada fabryka oraz informację o hali w której się znajdują. Czyli naszym celem będzie wypisać nazwy wszystkich maszyn wraz z ich ID z tabeli MASZYNY oraz nazwę hali i jej adres z tabeli HALE. Zapytanie będzie wyglądać następująco:

SELECT maszyny.id_maszyny, maszyny.nazwa,hale.nazwa,hale.miasto,hale.adres FROM maszyny
JOIN hale ON maszyny.id_hali = hale.id_hali;

Na pierwszy rzut oka wszytko jest w porządku, ale naszym celem było wypisać WSZYSTKIE maszyny. Jak można zaobserwować wyżej, w tabeli MASZYNY znajduje się dziesięć rekordów, czyli w naszym rozwiązaniu brakuje 3 maszyn. Czym jest to spowodowane?

Jest to spowodowane tym, że JOIN (INNER JOIN) wypisuję tylko część wspólną tabel, a skore Tokarka max, Obrabiarka max, Suwnica max nie posiadają przypisanej hali, INNER JOIN nie wyświetli ich. Jak to naprawić? Użyjemy LEFT JOIN.

LEFT JOIN lub RIGHT JOIN

Jest to łączenie które wypisuję cały wybrany zbiór oraz wspólną część, dobrze jest to przedstawione na poniższym obrazku

Przeróbmy nasze wcześniejsze zapytanie i spróbujmy jeszcze raz wypisać potrzebne nam dane

SELECT maszyny.id_maszyny, maszyny.nazwa,hale.nazwa,hale.miasto,hale.adres FROM maszyny
LEFT JOIN hale ON maszyny.id_hali = hale.id_hali
ORDER BY maszyny.id_maszyny;

Teraz uzyskaliśmy to co było nam potrzebne. Jak to zrobiliśmy? LEFT JOIN wypisał wszystkie maszyny z tabeli MASZYNY i część wspólną z tabeli HALE. Jeśli jakaś maszyna nie ma przepisanej hali to w wyniku otrzymamy w kolumnach opisujących hale null.

A co się stanie jak użyjemy RIGHT JOIN? Wybierając RIGHT JOIN informujemy, że chcemy wyświetlić wszystkie dane z tabeli po prawej stronie JOINA.

maszyny LEFT JOIN hale Otrzymamy cały zbiór danych z tabeli MASZYNY ponieważ jest po lewej stronie JOIN oraz część wspólną z tabelą HALE

hale RIGHT JOIN maszyny Otrzymamy ten sam wynik co powyżej ponieważ zmieniliśmy klauzule, ale również zmieniliśmy kolejność tabel

maszyny RIGHT JOIN hale Otrzymamy cały zbiór danych z tabeli HALE ponieważ jest po prawej stronie JOIN oraz część wspólną z tabelą MASZYNY

Teraz przerobimy trochę nasz kod.

SELECT maszyny.id_maszyny, maszyny.nazwa,hale.nazwa,hale.id_hali,hale.miasto,hale.adres FROM maszyny
RIGHT JOIN hale ON maszyny.id_hali = hale.id_hali;

Wynik będzie następujący:

Otrzymaliśmy teraz odwrotność wcześniejszego wyniku. Jak używając left join uzyskaliśmy informację o wszystkich maszynach, to teraz korzystając z right join otrzymujemy informację o wszystkich halach. Dzięki temu mamy listę wszystkich hal wraz z informacją jakie maszyny się w nich znajdują.

FULL JOIN

Jest to łączenie które wypisuję wszystkie elementy łączonych ze sobą tabel.

Teraz połączymy ze sobą tabele za pomocą full join i wyświetlimy wszystkie dane.

SELECT * FROM maszyny
FULL JOIN hale ON maszyny.id_hali = hale.id_hali ORDER BY hale.id_hali;

Otrzymamy taki o to wynik:

Otrzymaliśmy wszystkie dane z tabel które połączyliśmy, jak możesz zauważyć uzyskaliśmy połączone dane z wcześniejszych wyników po łączeniu LEFT JOIN oraz RIGHT JOIN.

PODSUMOWANIE

JOIN umożliwia nam łączenie tabel i uzyskiwać, wyciągać potrzebne nam dane z kilku tabel. Istnieją jednak przypadki kiedy możliwości JOINA są ograniczone i musimy chwycić po inne klauzulę. Mamy do wyboru również LEFT JOIN oraz RIGHT JOIN który wyświetli nam wszystkie dane z określonego przez nas zbioru, tabeli oraz część wspólną z drugiego zbioru. Wybrać możemy również FULL JOIN który umożliwia nam wyświetlenie wszystkich danych z połączonych tabel.