Komenda JOIN w bazach danych MYSQL - str. 2 - INNER JOIN - JOIN LEFT - JOIN RIGHT - NATURAL JOIN - EQUI JOIN - CROSS JOIN - LEFT JOIN - RIGHT JOIN - LEFT OUTER JOIN - RIGHT OUTER JOIN - FULL OUTER JOIN - SELF-JOIN - MERGE ROWS - OUTER JOINS
Mouser Electronics Poland   Przedstawicielstwo Handlowe Paweł Rutkowski   Amper.pl sp. z o.o.  

Energetyka, Automatyka przemysłowa, Elektrotechnika

Dodaj firmę Ogłoszenia Poleć znajomemu Dodaj artykuł Newsletter RSS
strona główna BAZA WIEDZY Komenda JOIN w bazach danych MYSQL
drukuj stronę
poleć znajomemu

Komenda JOIN w bazach danych MYSQL

Zmodyfikuję trochę zawartość tabeli aby prawidłowo pokazać następne przykłady (zmiana id działu administracja):

 

 

Outer joins

Outer joins nie wymagają tego, aby w każdej z tabel był element o tej samej wartości elementu "łączącego" tabele.  Zachowywany jest każdy rekord tabeli nawet jeśli żaden rekord drugiej tabeli do niego nie pasuje.  Rozróżniamy left outer joins, right outer joins, and full outer joins w zależności od tego, z której tabeli chcemy zachować wszystkie wartości.

-------------------------------------------------------------------------------------------

 

 

Left outer join / left join

Wynikiem operacji left outer join (lub wersja uproszczona left join) dla tabel A i B jest tabela zawierająca wszystkie rekordy z tabeli lewej (A) nawet jeśli wynik join nie znajduje odpowiedników z tabeli prawej - więc jeśli żaden z rekordów tabeli B nie pasuje do rekordów z tabeli A , join zwróci wiersze tabeli A z odpowiednią ilością wartości NULL w każdej kolumnie tabeli B.

Podsumowując left outer join zwraca wszystkie wartości z tabeli lewej + pasujące wartości z tabeli prawej ( w przypadku braku dopasowania pojawiają się pola NULL).

W sytuacji gdy do jednego wiersza tabeli lewej dopasowanych jest więcej wierszy z tabeli prawej, wiersze z tabeli lewej zostaną powtórzone tak, aby wszystkie dopasowania z tabeli prawej mogły być poprawnie wyświetlone.

SELECT *  FROM   pracownik  LEFT OUTER JOIN dzial 
ON pracownik.ID_dzialu = dzial.ID_dzialu

Jak łatwo zauważyć gdy zmianie uległo id administracji Kulikowski i Nowik stracili pracę ;) nie ma odpowiadających id działów (do których zostali przypisani) nazw działów stąd wartości NULL. Bez wykoannych zmian w tabeli wynik operacji left join wyglądałby następująco:

----------------------------------------------------------------------------------------------------------------------- 

 

Right outer join / right join

Lub w skrócie right join jest niemalże identyczny z left join z tą różnicą że zachowywana zawsze jest zawartość tabeli prawej - B. Jeżeli do wiersza z tabeli B pasuje więcej niż 1 wiersz z tabeli A wiersze z tabeli B będą zdublowane, nadomiast nalogicznie jeśli żaden rekord z tabeli A nie pasuje do rekordu z tabeli B zostaną wstawione wartości NULL.

SELECT * FROM   pracownik RIGHT OUTER JOIN dzial
          ON pracownik.ID_dzialu = dzial.ID_dzialu

Jak widać zgodnie z opisem pozostały tylko 4 rekordy, w administracji nikt nie pracuje i nie ma sytuacji gdzie kilku pracowników pracowałoby w jednym dziale ( brak powtórzeń rekordów z nazwami działów).

Powyższy efekt można uzyskać komendą left join zamieniając kolejność tabel w komendzie:

SELECT * FROM   dzial LEFT OUTER JOIN pracownik
          ON pracownik.ID_dzialu = dzial.ID_dzialu

---------------------------------------------------------------------------------------

 

 

Full outer join

Efektem tej operacji jest wynik łączący efekt left outer join i right outer join. Tabela wynikowa będzie zawiwerała rekordy z obu tabel i wypełni wartościąNULL brakujące dopasowania na każdej ze stron.

Pozwoli to przykładowo zobaczyć który pracownik pracuje w jakim departamencie, dodatkowo pokaże departamenty bez pracowników i osoby nie przypisane żadnemu departamentowi.

SELECT * FROM   pracownik
       FULL OUTER JOIN dzial
          ON pracownik.ID_dzialu = dzial.ID_dzialu

Niektóre bazy danych w tym (MYSQL) nie obsługują tej funkcjonalności bezpośrednio, lecz mogą być emulowane za pomocą left join, right join i union.

SELECT *FROM   pracownik
       LEFT JOIN dzial
          ON pracownik.ID_dzialu = dzial.ID_dzialu
UNION
SELECT *FROM   pracownik
       RIGHT JOIN dzial
          ON pracownik.ID_dzialu = dzial.ID_dzialu

SQLite nie obłsuguje right join'ów więc outer join może byćemulowany w następujący sposób: 

SELECT pracownik.*, dzial.* FROM   pracownik
       LEFT JOIN dzial
          ON pracownik.ID_dzialu = dzial.ID_dzialu
UNION ALL
SELECT pracownik.*, dzial.* FROM   dzial
       LEFT JOIN pracownik
          ON pracownik.ID_dzialu = dzial.ID_dzialu
WHERE  pracownik.ID_dzialu IS NULL

-----------------------------------------------------------------------------------------------------------------------------

 

Self join

zapytanie to pozwala np znaleźć wszystkie dopasowania wewnątrz  jednej tabeli np wszystkich pracowników z tego samego kraju. Jeśli posiadasz 2 oddzielne tabele z pracownikami i krajami oraz powiązaniami to nie ma problemu z wykorzystaniem poprzednich join'ów. Self join ma zastosowanie gdy wszystko odbywa się wewnątrz jednej wielkiej tabeli agregującej wszystkie dane.


 

wpis stowyrzłem na podstawie: Wikipedia

REKLAMA

Otrzymuj wiadomości z rynku elektrotechniki i informacje o nowościach produktowych bezpośrednio na swój adres e-mail.

Zapisz się
Administratorem danych osobowych jest Media Pakiet Sp. z o.o. z siedzibą w Białymstoku, adres: 15-617 Białystok ul. Nowosielska 50, @: biuro@elektroonline.pl. W Polityce Prywatności Administrator informuje o celu, okresie i podstawach prawnych przetwarzania danych osobowych, a także o prawach jakie przysługują osobom, których przetwarzane dane osobowe dotyczą, podmiotom którym Administrator może powierzyć do przetwarzania dane osobowe, oraz o zasadach zautomatyzowanego przetwarzania danych osobowych.
Komentarze (9)
Dodaj komentarz:  
Twój pseudonim: Zaloguj
Twój komentarz:
dodaj komentarz
No avatar
Gość
Dobre ale mało. Co jest ? Jak wpisze * to mi wyświetli dobrze a jak tylko np. nazwisko i imie to wyrzuca błąd ?
No avatar
karol
Bardzo dziękuje za ładnie wytłumaczony poradnik na przykładzie.
No avatar
Gość
i zrobiłem kilka błędów przy okazji .... ;D ( nadomiast nalogicznie "
No avatar
Gość
Bardzo proste wytłumaczone i zobrazowane :D
Tego szukałem
pozdro dla Twórcy :D
No avatar
Jedrolo
DZIEKI! Wreszcie.
No avatar
elpe3k
Jeżeli do danych z tabeli przed słowem kluczowym LEFT lub RIGHT dokoptować z lewej lub prawej strony, zgodnie z nazwą słowa kluczowego zawartość drugiej tabeli , to zawsze wyświetlane są wszystkie dane z tabeli prawej z wartościami null, jeśli nie było polączenia w tabeli lewej.
Brak obrazka
czepiasz się drobnostek ;) . Ci co są w temacie ( Ja , Ty i reszta osób które to czytają dobrze wiedzą o co chodzi) , niemniej dziękuję za zwrócenie uwagi. pozdrawiam
No avatar
Roszo
Pierwsze zdanie i już wielka gafa :
Wielu z nas spotkało się z problemem polegającym na tym, że potrzebne nam dane rozmieszczone są w kilku bazach danych.

Podejrzewam że chodziło o tabele w bazie danych.
No avatar
Ostah
Bardzo przyjemnie wytłumaczone, dzięki :)

REKLAMA
REKLAMA
REKLAMA
REKLAMA
Politechnika Lubelska Politechnika Lubelska Grupa zrzeszająca studentów i absolwentów Politechniki Lubelskiej
Elektroinstalatorzy - instalacje elektryczne Elektroinstalatorzy - ... Forum w którym są poruszane tematy związane z branżą elektroinstalacyjną, osprzętem. Porady, opinie, ...
Po godzinach Po godzinach Po godzinach to miejsce odpoczynku, przeczytasz tu kawały, dowcipy,śmieszne historie i inne rzeczy ...
Oprogramowanie projektowe Oprogramowanie projektowe Grupa zrzeszająca osoby i poruszająca tematy z zakresu projektowania za pomocą oprogramowania CAD
REKLAMA
Nasze serwisy:
elektrykapradnietyka.com
przegladelektryczny.pl
rynekelektroniki.pl
automatykairobotyka.pl
budowainfo.pl