W poprzednich dwóch wpisach pokazałem w jaki sposób używać inner join oraz left join. W dzisiejszym wpisie pokażę o co chodzi w full outer join. Po krótce, zapytanie zwróci wszystkie wiersze które:
- Pasują tylko do tabeli lewej,
- Pasują tylko do tabeli prawej,
- Tabela lewa ma pasującą wartość w tabeli prawej
Czyli dla jasności pokaże wszystkie wyniki nawet wtedy, gdy druga z tabel wyświetli wartość nieokreśloną NULL.
PostgreSQL Full Outer Join Nieco teorii…
Poniżej schemat użycia full outer join.
1 2 |
SELECT * FROM A FULL [OUTER] JOIN B on A.pka = B.fka; |
Przygotuj teraz dwie tabele z danymi, które pozwolą przećwiczyć tę lekcję. Pierwsza tabela o nazwie departments(działy), będzie zawierała id działu oraz jego nazwę. Druga o nazwie employees (pracownicy), będzie przechowywała imię oraz nazwisko pracownika oraz przypisanie jego osoby do działu.
1 2 3 4 5 |
CREATE TABLE IF NOT EXISTS departments ( department_id serial PRIMARY KEY, department_name VARCHAR (255) NOT NULL ); |
1 2 3 4 5 6 |
CREATE TABLE IF NOT EXISTS employees ( employee_id serial PRIMARY KEY, employee_name VARCHAR (255), department_id INTEGER ); |
Poniżej insert (o którym dowiesz się więcej później), który doda informacje o działach oraz pracownikach do tabel. Na ten moment po prostu przekopiuj ten kod i wykonaj go w query tool w PostgreSQL.
1 2 3 4 5 6 7 |
INSERT INTO departments (department_name) VALUES ('Sales'), ('Marketing'), ('HR'), ('IT'), ('Production'); |
1 2 3 4 5 6 7 8 9 10 11 |
INSERT INTO employees ( employee_name, department_id ) VALUES ('Jan Kowalski', 1), ('Monika Kwiatkowska', 1), ('Tomasz Kos', 2), ('Joanna Miksa', 3), ('Beata Lesiak', 4), ('Maciej Kot', NULL); |
Po poprawnym wykonaniu tych poleceń, zobaczysz dane w tabelkach. Przejdź zatem do przetestowania full join.
Przykłady,przykłady…
Poniżej przykłady użycia full join. Pierwszy pokazuje pełne informacje z obydwu tabel na temat pracownika oraz działu w którym pracuje. Zobaczysz również pracownika Maciej Kot, który nie jest przypisany do żadnego działu. Drugim przypadkiem jest dział production do którego nie został przypisany żaden pracownik. Widzisz, że full join pokazał każdy z tych 3 przypadków, który opisałem na wstępie.
1 2 3 4 5 6 |
SELECT e.employee_name, d.department_name FROM employees e FULL OUTER JOIN departments d ON d.department_id = e.department_id; |
Podobnie jak to miało miejsce w poprzednich wpisach możesz użyć klauzuli WHERE, aby pobrać dział, który nie ma przypisanego żadnego pracownika, oraz pracownika, który nie jest przypisany do żadnego działu.
1 2 3 4 5 6 7 8 |
SELECT e.employee_name, d.department_name FROM employees e FULL OUTER JOIN departments d ON d.department_id = e.department_id WHERE e.employee_name IS NULL; |
W wyniku tego zapytani powinien pojawić się tylko jeden rekord z działem production.
1 2 3 4 5 6 7 8 |
SELECT employee_name, department_name FROM employees e FULL OUTER JOIN departments d ON d.department_id = e.department_id WHERE department_name IS NULL; |
W tym przypadku powinien pojawić się również jeden wiersz pracownikiem Maciej Kot, który nie ma przypisanego żadnego działu.
To tyle w tym wpisie, zapraszam na kolejny, w którym poznasz Left Join.
Dziękuję Ci, za poświęcony czas na przeczytanie tego artykułu. Jeśli był on dla Ciebie przydatny, to gorąco zachęcam Cię do zapisania się na mój newsletter, jeżeli jeszcze Cię tam nie ma. Proszę Cię także o “polubienie” mojego bloga na Facebooku oraz kanału na YouTube – pomoże mi to dotrzeć do nowych odbiorców. Raz w tygodniu (niedziela punkt 17.00) otrzymasz powiadomienia o nowych artykułach / projektach zanim staną się publiczne. Możesz również pozostawić całkowicie anonimowy pomysł na wpis/nagranie.
Link do formularza tutaj: https://beitadmin.pl/pomysly
Pozostaw również komentarz lub napisz do mnie wiadomość odpisuję na każdą, jeżeli Masz jakieś pytania:).