Zewnętrzne złączenia (OUTER JOIN)

Zapytanie OUTER JOIN w MySQL umożliwia łączenie tabel w taki sposób, że zwrócone zostaną wszystkie rekordy z jednej tabeli, a pasujące rekordy z drugiej tabeli. Główna różnica między OUTER JOIN a INNER JOIN polega na tym, że w przypadku OUTER JOIN rekordy z jednej tabeli, które nie mają pasujących danych w drugiej tabeli, będą nadal zwracane, ale z wartościami NULL w miejscu brakujących danych.

W MySQL dostępne są trzy rodzaje złączeń zewnętrznych: LEFT OUTER JOIN, RIGHT OUTER JOIN, oraz symulacja FULL OUTER JOIN (ponieważ MySQL nie obsługuje pełnych złączeń OUTER JOIN bezpośrednio).

📌 Składnia zapytania OUTER JOIN

✅ Podstawowa składnia:

  • OUTER JOIN – definiuje typ złączenia. Używamy LEFT OUTER JOIN lub RIGHT OUTER JOIN w zależności od potrzeby.
  • ON – wskazuje warunek, na podstawie którego zostaną połączone obie tabele.
  • kolumny – kolumny, które mają zostać wyświetlone w wyniku zapytania.
Przykład
-- Podstawowa składnia
SELECT kolumny
FROM tabela1
LEFT OUTER JOIN tabela2
ON tabela1.kolumna = tabela2.kolumna;

📌 LEFT OUTER JOIN i RIGHT OUTER JOIN – Złączenia lewostronne i prawostronne

✅ Opis:

  • LEFT OUTER JOIN zwraca wszystkie rekordy z lewej tabeli (tutaj uzytkownicy) oraz pasujące do nich rekordy z prawej tabeli (zamowienia).
  • RIGHT OUTER JOIN zwraca wszystkie rekordy z prawej tabeli (tutaj zamowienia) oraz pasujące do nich rekordy z lewej tabeli (uzytkownicy).
  • W przypadku braku pasujących rekordów w jednej z tabel, wstawiane są wartości NULL w miejsce brakujących danych.

✅ Zastosowanie:

  • LEFT OUTER JOIN jest używane, gdy zależy nam na tym, by mieć pełne dane z lewej tabeli, niezależnie od tego, czy mają one odpowiadające dane w prawej tabeli.
  • RIGHT OUTER JOIN jest używane, gdy zależy nam na tym, by mieć pełne dane z prawej tabeli, niezależnie od tego, czy mają one odpowiadające dane w lewej tabeli.
Przykład
-- LEFT OUTER JOIN (Złączenie lewostronne)
SELECT uzytkownicy.imie, zamowienia.id_zamowienia
FROM uzytkownicy
LEFT OUTER JOIN zamowienia
ON uzytkownicy.id = zamowienia.id_uzytkownika;

-- RIGHT OUTER JOIN (Złączenie prawostronne)
SELECT uzytkownicy.imie, zamowienia.id_zamowienia
FROM uzytkownicy
RIGHT OUTER JOIN zamowienia
ON uzytkownicy.id = zamowienia.id_uzytkownika;

📌 FULL OUTER JOIN – Złączenie pełne (Symulacja w MySQL)

✅ Przykład: Symulacja FULL OUTER JOIN za pomocą LEFT JOIN i RIGHT JOIN

📌 Opis:

  • FULL OUTER JOIN łączy rekordy z obu tabel: uzytkownicy i zamowienia.
  • Dzięki użyciu kombinacji LEFT JOIN i RIGHT JOIN w MySQL można uzyskać wynik, który obejmuje wszystkie rekordy z obu tabel, nawet jeśli nie mają one pasujących danych w drugiej tabeli.
Przykład
SELECT uzytkownicy.imie, zamowienia.id_zamowienia
FROM uzytkownicy
LEFT OUTER JOIN zamowienia
ON uzytkownicy.id = zamowienia.id_uzytkownika
UNION
SELECT uzytkownicy.imie, zamowienia.id_zamowienia
FROM uzytkownicy
RIGHT OUTER JOIN zamowienia
ON uzytkownicy.id = zamowienia.id_uzytkownika;

📌 Zastosowania OUTER JOIN

✅ Przykład: Przykład użycia OUTER JOIN w rzeczywistej aplikacji

📌 Opis:

  • Zapytanie zwraca wszystkich klientów oraz ich zamówienia. Klienci, którzy nie złożyli żadnego zamówienia, będą mieli wartość NULL w kolumnie id_zamowienia.

✅ Zastosowanie:

  • OUTER JOIN jest przydatne, gdy chcemy uzyskać pełny zbiór danych z jednej tabeli (np. klientów), niezależnie od tego, czy są one powiązane z innymi danymi (np. zamówieniami).
Przykład
SELECT klienci.nazwa, zamowienia.id_zamowienia
FROM klienci
LEFT OUTER JOIN zamowienia
ON klienci.id = zamowienia.id_klienta;

Podsumowanie

  • OUTER JOIN zwraca wszystkie rekordy z jednej tabeli i pasujące rekordy z drugiej tabeli. Jeśli brak pasujących danych w drugiej tabeli, zostaną zwrócone wartości NULL.
  • MySQL obsługuje LEFT OUTER JOIN (złączenie lewostronne) oraz RIGHT OUTER JOIN (złączenie prawostronne). Można także symulować FULL OUTER JOIN za pomocą kombinacji tych dwóch złączeń.
  • LEFT OUTER JOIN zwraca wszystkie rekordy z lewej tabeli, a RIGHT OUTER JOIN z prawej.
  • Warto używać OUTER JOIN, gdy zależy nam na uzyskaniu pełnego zbioru danych z jednej tabeli, niezależnie od powiązań w drugiej tabeli.