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:
- lewa tabela jest przed
RIGHT JOIN; - 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.
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.
Wybór głównej tabeli Zazwyczaj wybierasz
LEFTalboRIGHTw zależności od tego, która tabela (lewa czy prawa) jest dla Ciebie ważniejsza i w jakiej kolejności wygodniej pisać zapytanie.Równoważność Każde
RIGHT JOINmożna przepisać jakoLEFT JOINzamieniają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:
- Zapominają o warunku łączenia
ON. Bez warunku dostaniesz iloczyn kartezjański tabel, co może zrobić niezły bałagan. - Mylą
RIGHT JOINiLEFT JOIN. Jeśli użyjesz tabel w złej kolejności, wynik będzie błędny. - Nie obsługują wartości
NULL. W wyniku zapytań zRIGHT JOINczęsto pojawiają sięNULL, które trzeba poprawnie zinterpretować albo zamienić przezCOALESCE().
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!
GO TO FULL VERSION