Wiem ze juzbylo ale nadal nie rozumiem - roznica pomiedzy INNER, LEFT, RIGHT, FULL JOIN

0

Witam panowie,

Temat JOIN w SQL to dla mnie zagadka, niby sa obrazki ktore znalazlem ale nadal tego nie rozumiem. Wiem tylko ze LEFT i RIGHT JOIN sa ze soba wymienne. Ale jak wyglada sprawa z wieloma rekordami w jednej tabeli gdy w innej jest tylko 1 z danym kluczem ? No i co mnie irytuje czy ktos moze mi wyjasnic przyklad z JOIN oraz IS NULL tzn. SELECT kolumna FROM TABELA X LEFT JOIN TABELA Y ON X.klucz=Y.klucz WHERE Y.klucz IS NULL ? Nie rozumiem co to i po co w jakich przypadkach sie to stosuje naprawde tego to juz w ogóle nie potrafie zrozumiec. Dotychczas zrozumialem ze LEFT JOIN to przylaczenie do tabeli pierwszej tej drugiej (po JOIN) i jesli sa rekordy z odpowiednim kluczem w drugiej to te zostana przypisane do tej pierwszej a jesli nie ma to bedzie w tych rekordach z drugiej NULL.

Nie chce zeby ktos marnowal czas na wypisywaniu specjalnie dla mnie ale moze jest jakis opis tego taki prosty zrozumialy dla poczatkujeca programisty w jezyku PL (troche znam eng ale latwiej bedzie mi to zrozumiec w pl).

Pozdro i dzieki !

1

Wujek google nie gryzie: znalazlem kilka prostych wyjasnien:

https://ebulb.pl/question.php?f=78&t=67&p=111#p111

http://www.elektroonline.pl/a/2460/2,Komenda-JOIN-w-bazach-danych-MYSQL

http://it.dth.pl/select-from-inner-join-right-left-outer-join-kursjezyka-sql-mysql-cz-4c/

Jesli to przestudiujesz to zrozumiesz nic skomplikowanego moze poza tym przypadkiem z IS NULL ktory podales:

SELECT kolumna FROM TABELA X LEFT JOIN TABELA Y ON X.klucz=Y.klucz WHERE Y.klucz IS NULL

Wyobraz sobie jak dziala baza danych (jak to widzi):

SELECT kolumna FROM TABELA X - czyli wczytaj do cache tabele X
LEFT JOIN TABELA Y ON X.klucz=Y.klucz - do tabeli A znajdujacej sie w cache przypisz wedlug klucza "klucz" rekordy z tabeli Y - jesli ich nie ma - przypisz NULL
WHERE Y.klucz IS NULL - pokaz wyniki tylko te gdzie klucz w tabeli Y jest NULL

Oznacza to ze pozostaja tylko wyniki z tabeli x ktore w tabeli Y maja wartosc NULL (wartosc klucza).
Czyli cale zapytanie to: pokaz rekordy z X ale tylko te ktorych klucz z X nie ma swojego odpowiednika w Y.

1

Mając tabele A i B odpowiednio:
A:
x, y, z
B:
1, 2, 3

połączone relecja
A <-> B
x - 1,2
y - 2

Teraz **left **łączy lewe z prawymi gdy nie ma relacji to wstawia null po prawej stronie więc:
x - 1
x - 2
y - 2
z - null

right bierze to co z prawej i wstawia null po lewej gdy nie ma relacji:
1 - x
2 - x
2 - y
3 - null

full bierze z każdej strony:
x - 1
x - 2
y - 2
z - null

3 - null

Dla inner full join
x - 1
x - 2
y - 2

1

To jest bardzo fajne, i wydaje mi sie najbardziej zrozumiałe przedstawienie logiki joinów w sql

http://2.bp.blogspot.com/-ydUTsFd11Ok/UiV8EKJezWI/AAAAAAAACUQ/-pWSuWnv4yU/s1600/sql+joins.jpg

2

joins.jpg

1 użytkowników online, w tym zalogowanych: 0, gości: 1