JOIN czyli jak połączyć kilka tabel

Funkcja złączenia JOIN pozwala na wyświetlenie danych dwóch lub więcej tabel wzajemnie ze sobą powiązanych.

Aby zrozumieć zawiłości funkcji JOIN przygotujemy sobie dwie tabele:

create table tabela_pl (cyfra int,nazwa varchar(50));
create table tabela_en (number int,name varchar(50));

Wrzucamy do nich kilka wierszy (do pierwszej słowa polskie do drugiej angielskie)
insert into tabela_pl values(1,'jeden');
insert into tabela_pl values(2,'dwa');
insert into tabela_pl values(3,'trzy');
insert into tabela_pl values(4,'cztery');

lub w jednej linii
insert into tabela_pl values(1,'jeden'),(2,'dwa'),(3,'trzy'),(4,'cztery');
(4 row(s) affected)

i druga tabela
insert into tabela_en values(1,'one'),(2,'two'),(5,'five'),(7,'seven');
(4 row(s) affected)

Wyświetlimy najpierw pierwszą tabelę
SQL> select liczba, nazwa from tabela_pl

cyfra       nazwa
----------- --------------------------
1           jeden
2           dwa
3           trzy
4           cztery

(4 row(s) affected)

SQL> select number, name from tabela_en

number      name
----------- --------------------------------------------------
1           one
2           two
5           five
7           seven

(4 row(s) affected)

CROSS JOIN #############################################

Iloczyn kartezjański czyli kombinacja każdej wartości z pierwszej tabeli i drugiej tabeli wyświetla polecenie:

SELECT * FROM tabela_pl CROSS JOIN tabela_en

cyfra       nazwa                 number      name
----------- ----------------- ----------- -----------------------
1           jeden                 1           one
2           dwa                   1           one
3           trzy                  1           one
4           cztery                1           one
1           jeden                 2           two
2           dwa                   2           two
3           trzy                  2           two
4           cztery                2           two
1           jeden                 5           five
2           dwa                   5           five
3           trzy                  5           five
4           cztery                5           five
1           jeden                 7           seven
2           dwa                   7           seven
3           trzy                  7           seven
4           cztery                7           seven

(16 row(s) affected)

(INNER) JOIN ###########################################

Zwraca wspólne dane pierwszej (nazwa) i drugiej tabeli (name) powiązane wspólną kolumną (numer=number).
Wyświetlane są tylko wiersze które występują w jednej i drugiej tabeli.

SELECT * FROM tabela_pl, tabela_en WHERE tabela_pl.cyfra=tabela_en.number;

cyfra       nazwa                 number      name
----------- ----------------- ----------- -----------------------
1           jeden                   1           one
2           dwa                     2           two

(2 row(s) affected)

Taki sam wynik zwróci nam polecenie JOIN (nie ma potrzeby wpisywać polecenie INNER):

SELECT * FROM tabela_pl INNER JOIN tabela_en On tabela_pl.cyfra=tabela_en.number
lub
SELECT * FROM tabela_pl JOIN tabela_en On tabela_pl.cyfra=tabela_en.number;

cyfra       nazwa                 number      name
----------- ----------------- ----------- -----------------------
1           jeden                   1           one
2           dwa                     2           two

(2 row(s) affected)

LEFT (OUTER) JOIN ######################################

Wyświetla dane z lewej tabeli (tabela_pl) wiążąc ją z tabelą prawą (tabela_en) wspólną kolumną (numer=number)

SELECT * FROM tabela_pl LEFT OUTER JOIN tabela_en On tabela_pl.cyfra=tabela_en.number;
lub
SELECT * FROM tabela_pl LEFT JOIN tabela_en On tabela_pl.cyfra=tabela_en.number;

cyfra       nazwa                 number      name
----------- ----------------- ----------- -----------------------
1           jeden                 1           one
2           dwa                   2           two
3           trzy                  NULL        NULL
4           cztery                NULL        NULL

(4 row(s) affected)

RIGHT (OUTER) JOIN #####################################

Wyświetla dane z prawej tabeli (tabela_en) wiążąc ją z tabelą lewą (tabela_en) wspólną kolumną (numer=number)

SELECT * FROM tabela_pl RIGHT OUTER JOIN tabela_en On tabela_pl.cyfra=tabela_en.number
lub
SELECT * FROM tabela_pl RIGHT JOIN tabela_en On tabela_pl.cyfra=tabela_en.number

cyfra       nazwa                 number      name
----------- ----------------- ----------- -----------------------
1           jeden                1           one
2           dwa                  2           two
NULL        NULL                 5           five
NULL        NULL                 7           seven

(4 row(s) affected)

FULL (OUTER) JOIN ######################################

Wyświetla dane z prawej tabeli (tabela_en) i tabeli lewej lewą (tabela_en) wiążąc wspólną kolumną (numer=number)

SELECT * FROM tabela_pl FULL OUTER JOIN tabela_en On tabela_pl.cyfra=tabela_en.number
lub
SELECT * FROM tabela_pl FULL JOIN tabela_en On tabela_pl.cyfra=tabela_en.number

cyfra       nazwa                 number      name
----------- ----------------- ----------- -----------------------
1           jeden                 1           one
2           dwa                   2           two
3           trzy                  NULL        NULL
4           cztery                NULL        NULL
NULL        NULL                  5           five
NULL        NULL                  7           seven

(6 row(s) affected)

Ten wpis został opublikowany w kategorii TSQL i oznaczony tagami . Dodaj zakładkę do bezpośredniego odnośnika.

Dodaj komentarz