Ciąg dalszy czwartej C części kursu języka SQL. Tym razem omówię polecenie SELECT, tym razem z : INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN. Przy ich pomocy możemy łączyć ze sobą kilka tabel.
• INNER JOIN – łączenie tabel przy wyświetlaniu
W naszych tabelach przechowujemy różne dane, takie jak: pensje, adresy, czy stanowiska. Co w przypadku kiedy chcielibyśmy wyświetlić te dane w jednej tabeli ? Możemy tego dokonać stosując operator INNER JOIN (złączenie wewnętrzne tabel) razem z poleceniem SELECT, które złączy wskazane przez nas tabele i kolumny. Polecenie będzie miało wtedy następującą składnie:
SELECT lista_kolumn FROM nazwa_tabeli INNER JOIN nazwa_tabeli_2 ON warunek_złączenia
Przykład:
Zadaniem naszym jest wyświetlenie w jednej tabeli następujących danych: „id_pracownika”, „imie”, „nazwisko” oraz „adres_email”. Trzy pierwsze dane znajdują się w tabeli „pracownik”, zaś adres e-mail w tabeli „adresy”. Wspólnym polem dla obu tabel jest „id_pracownika” i to ono posłuży nam do złączenia tabel następującym poleceniem:
SELECT pracownik.id_pracownika, imie, nazwisko, adres_email FROM pracownik INNER JOIN adresy ON pracownik.id_pracownika = adresy.id_pracownika
Tab. 4.6 Złączenie tabel pracownik oraz adresy
id_pracownika |
imie |
nazwisko |
adres_email |
12008 |
Jan |
Kowalski |
jkowalski@msql.pl |
22008 |
Adam |
Nowakowski |
anowak@msql.pl |
32008 |
Kasia |
Kowalska |
NULL |
W trzecim rzędzie pole adresu ma wartość NULL, ponieważ nie zawierało w bazie danych adresu e-mail. Warunek złączenia: pracownik.id_pracownika = adresy.id_pracownika składa się z nazwy_pierwszej_tabeli.wspolna_kolumna = nazwa_drugiej_tabeli.wspolna_kolumna.
Jeżeli chcielibyśmy do tej tabeli dołączyć jeszcze informacje na temat stanowiska pracownika przechowywane w polu „stanowisko” w tabeli „stanowiska” polecenie miałoby następującą formę:
SELECT pracownik.id_pracownika, imie, nazwisko, adres_email, stanowisko FROM pracownik INNER JOIN adresy ON pracownik.id_pracownika = adresy.id_pracownika INNER JOIN stanowiska ON pracownik.id_pracownika = stanowiska.id_pracownika
Tab. 4.7 Złączenie tabel pracownik, adresy oraz stanowiska
id_pracownika |
imie |
nazwisko |
adres_email |
stanowisko |
12008 |
Jan | Kowalski | jkowalski@msql.pl | przedstawiciel handlowy |
22008 |
Adam | Nowakowski | anowak@msql.pl | księgowa |
32008 |
Kasia | Kowalska | NULL | kasjer |
W języku SQL mamy jeszcze następujące rodzaje złączeń:
o LEFT OUTER JOIN – lewostronne złączenie zewnętrzne, które zwraca wszystkie wiersze po lewej stronie klauzuli JOIN, zaś z tabeli po prawej stronie tylko wiersze dla których warunek złączenia jest prawdziwy. W przypadku kiedy wiersz z lewej tabeli nie ma odpowiadającego mu wiersza z prawej tabeli to odpowiednie pola zostają wypełniane wartością NULL.
o RIGHT OUTER JOIN – prawostronne złączenie zewnętrzne funkcjonuje w analogiczny sposób.
bardzo dziekuje =) przydalo sie
To super. Zapraszam do zamieszczania komentarzy i uwag dotyczących kursu SQL.
szukalem jasnego opisu i znalazlem! pozdrawiam!
Witam.
W przykładach na tej stronie wyskakują mi ostrzeżenie “#1052 – Column ‘id_pracownika’ in field list is ambiguous” dodanie nazwy tabeli do pierwszego ‘id_pracownika’ rozwiązuje problem.
Pozdrawiam.
Kolumna id_pracownika występuje we wszystkich tabelach, które chcemy złączyć, stąd ten błąd. Zatem nazwę kolumny należy poprzedzić nazwą tabeli (np. pracownik) z której chcemy ją pobrać, np: pracownik.id_pracownika.
Całe popołudnie kombinowałem jak wyciągnąć dane dwoma zapytaniami z dwóch tabel i wyświetlić w jednej tabeli na stronie. Kombinowałem…aż na szczęście trafiłem na tę stronę i wszystko jasne.
DZIĘKI
Bardzo czytelny i pomocny opis. Proszę o jeszcze !
Dzięki.
dzięki, fajnie i prosto wytłumaczone do tego wyjaśnienie różnic.
Bardzo dobrze i prosto wytłumaczone. Dzięki wielkie naprawdę się przydało. Pozdrawiam.
Słabo wyjaśnione, przykładowe zapytanie jest nieczytelne (nie wiadomo z której tabeli pochodzi dana kolumna, wypadałoby dodać aliasy do nazw tabel i odwołania do kolumn poprzedzać alisem)
Dziękuję, świetny art.
Bardzo dziękuję za ten kurs. Dopiero się uczę a Pańskie opracowanie jest świetne. Wszystko prosto i zrozumiale opisane. Pozdrawiam.
Witam, przepraszam za mały(a może i duży offtopic)
wszędzie pytam o to – ale bez echa – może Pan pomoże, Oraclowy BI i liczby powyżej miliona – wszystkie tabele nie wyrabiają w raportach i zamiast wartości są zera – czy ktoś wie jak to obejść?
– format liczb do 1 mnl jest ok
– jeśli ta wartość zostaje przekroczona – wartości są zerowe, a sumy E+…
pozdrawiam
Bardzo Ci dziekuje.
Dzięki, bardzo pomocne.
Pytanie do przykładu.
SELECT klienci.idklienta, imie, nazwisko, telefon, RMA, data, nazwaurzadzenia, opis FROM klienci INNER JOIN zlecenia ON klienci.idklienta = zlecenia.idklienta
Gdzie wstawić DESC żeby wyświetlało mi od największego do najmniejszego RMA?
A ja mam problem co w przypadku gdy muszę zrobić odpowiednik WHERE ( warunek )?
Czy istnieje cos takiego jak “LEFT INNER JOIN” ?
Świetny i konkretny poradnik. Dzięki.
Czytałem wiele kursów SQL z opisem funkcji ‘inner join’, jednak ten jest zdecydowanie najlepszy. Dziękuję.
Jakiego użyć polecenia, aby zmienić w tabeli A wartość kolumny B z “0” na “1” w wierszach od daty np. 2010-01-01 do 2010-12-31?
P.S.
Daty są zapisywane do kolumny C.
Świetny artykuł. Teraz wiem jak wyciągać dane z kilku tabel !!! Dzięki pozdrawiam