CodeGym /Kursy /SQL SELF /`RIGHT JOIN` i jego zastosowanie

`RIGHT JOIN` i jego zastosowanie

SQL SELF
Poziom 11 , Lekcja 3
Dostępny

Zacznijmy od definicji. RIGHT JOIN to taki typ join'a, który zwraca wszystkie wiersze z prawej tabeli (dlatego właśnie "prawy"), a z lewej tylko te pasujące. Jeśli w lewej tabeli nie ma danych odpowiadających wierszowi z prawej tabeli — dla kolumn lewej tabeli pojawią się wartości NULL.

Znacie już LEFT JOIN, to prawie to samo, tylko "w lustrze". Główna różnica to to, która tabela jest traktowana jako główna: lewa czy prawa.

Składnia RIGHT JOIN

Składnia RIGHT JOIN jest praktycznie identyczna jak LEFT JOIN. Oto jak to wygląda:

SELECT
    kolumny
FROM 
    tabela_lewa RIGHT JOIN tabela_prawa
ON 
    warunek_łączenia;

Zwróć uwagę na kolejność tabel:

  1. lewa tabela jest przed RIGHT JOIN;
  2. prawa tabela jest po słowie RIGHT JOIN.

Załóżmy, że mamy dwie tabele:

students — lista studentów:

student_id name
1 Otto
2 Maria
3 Alex

enrollments — wpisy o zapisach studentów na kursy:

enrollment_id course_name student_id
101 Matematyka 1
102 Informatyka 2
103 Biologia NULL

Teraz chcemy dostać listę wszystkich zapisów, a także info o studentach, jeśli istnieją. Jeśli student nie został znaleziony, zobaczymy NULL zamiast danych o studencie.

Zapytanie z użyciem RIGHT JOIN będzie wyglądać tak:

SELECT
    enrollments.enrollment_id,
    enrollments.course_name,
    students.name AS student_name
FROM 
    students RIGHT JOIN enrollments
    ON 
    students.student_id = enrollments.student_id;

Wynik:

enrollment_id course_name student_name
101 Matematyka Otto
102 Informatyka Maria
103 Biologia NULL

Widzimy tutaj, że wszystkie wpisy z tabeli enrollments (prawa tabela) trafiły do wyniku, nawet jeśli nie ma dla nich pasujących studentów w tabeli students (lewa tabela).

Porównanie RIGHT JOIN i LEFT JOIN

Jeśli już ogarniasz jak działa LEFT JOIN, możesz pomyśleć: "Po co w ogóle RIGHT JOIN? Czemu nie użyć LEFT JOIN?" Dobre pytanie! Sprawdźmy różnice i sytuacje, kiedy warto wybrać właśnie RIGHT JOIN.

  1. Kierunek danych

    • LEFT JOIN: zwraca wszystkie wiersze z lewej tabeli, niezależnie czy są dopasowania w prawej.
    • RIGHT JOIN: zwraca wszystkie wiersze z prawej tabeli, nawet jeśli nie ma dopasowań w lewej.
  2. Wybór głównej tabeli Zazwyczaj wybierasz LEFT albo RIGHT w zależności od tego, która tabela (lewa czy prawa) jest dla Ciebie ważniejsza i w jakiej kolejności wygodniej pisać zapytanie.

  3. Równoważność Każde RIGHT JOIN można przepisać jako LEFT JOIN zamieniając kolejność tabel. Na przykład:

    -- RIGHT JOIN
    SELECT *
    FROM students RIGHT JOIN enrollments
    ON students.student_id = enrollments.student_id;
    
    -- Równoważny LEFT JOIN
    SELECT *
    FROM enrollments LEFT JOIN students
    ON students.student_id = enrollments.student_id;

Więc jeśli nie lubisz RIGHT JOIN, zawsze możesz go unikać!

Kiedy używać RIGHT JOIN?

W praktyce RIGHT JOIN jest rzadziej używany niż LEFT JOIN. Ale są sytuacje, kiedy się przydaje:

  • Jeśli prawa tabela jest ważniejsza (np. to Twoja główna tabela);
  • Kiedy chcesz napisać zapytanie w takiej kolejności, że prawa tabela logicznie jest po lewej;
  • Jeśli pracujesz z kodem, który standardowo używa RIGHT JOIN.

Wizualizacja RIGHT JOIN

Żeby lepiej ogarnąć RIGHT JOIN, zobaczmy schemat:

Lewa tabela            Prawa tabela
   [ A ] --------> [ 1 ] 
   [ B ] --------> [ 2 ]
   [ C ] --------> [ 3 ]
   [ D ]           [ 4 ]

Przy użyciu RIGHT JOIN dostaniemy wszystkie wartości z prawej tabeli razem z pasującymi danymi z lewej. To, czego nie ma w lewej tabeli, będzie NULL.

Zadanie praktyczne

Sprawdźmy Twoją wiedzę w praktyce. Oto zadanie:

Masz tabele departments z działami i employees z pracownikami: departments:

department_id department_name
1 IT
2 Sprzedaż
3 Księgowość

employees:

employee_id name department_id
101 Peter 1
102 Eva 2
103 Ron NULL

Napisz zapytanie z użyciem RIGHT JOIN, które zwróci listę wszystkich działów, razem z pracownikami jeśli są w dziale, albo NULL jeśli nie ma pracowników.

Spróbuj najpierw samodzielnie rozwiązać, zanim spojrzysz na odpowiedź.

Odpowiedź do zadania

Tak wygląda zapytanie:

SELECT
    departments.department_name,
    employees.name AS employee_name
FROM employees RIGHT JOIN departments
    ON employees.department_id = departments.department_id;

Wynik będzie taki:

department_name employee_name
IT Peter
Sprzedaż Eva
Księgowość NULL

Typowe błędy przy użyciu RIGHT JOIN

Pracując z RIGHT JOIN, początkujący często mają takie problemy:

  1. Zapominają o warunku łączenia ON. Bez warunku dostaniesz iloczyn kartezjański tabel, co może zrobić niezły bałagan.
  2. Mylą RIGHT JOIN i LEFT JOIN. Jeśli użyjesz tabel w złej kolejności, wynik będzie błędny.
  3. Nie obsługują wartości NULL. W wyniku zapytań z RIGHT JOIN często pojawiają się NULL, które trzeba poprawnie zinterpretować albo zamienić przez COALESCE().

To wszystko! Teraz już wiesz jak używać RIGHT JOIN, rozumiesz różnicę między RIGHT JOIN i LEFT JOIN, i potrafisz wybrać odpowiedni typ join'a do swoich zadań. W następnej lekcji pogadamy więcej o FULL OUTER JOIN, gdzie łączymy wszystko-wszystko z obu tabel. Powodzenia w Twoich zapytaniach!

2
Zadanie
SQL SELF, poziom 11, lekcja 3
Niedostępne
Proste użycie `RIGHT JOIN`
Proste użycie `RIGHT JOIN`
2
Zadanie
SQL SELF, poziom 11, lekcja 3
Niedostępne
Użycie `RIGHT JOIN` z filtrowaniem
Użycie `RIGHT JOIN` z filtrowaniem
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION