SELECT FROM, INNER JOIN, RIGHT, LEFT OUTER JOIN – Kurs języka SQL (mySQL) cz. 4c

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.

24 comments to SELECT FROM, INNER JOIN, RIGHT, LEFT OUTER JOIN – Kurs języka SQL (mySQL) cz. 4c

  • erav

    bardzo dziekuje =) przydalo sie :)

  • To super. Zapraszam do zamieszczania komentarzy i uwag dotyczących kursu SQL.

  • masc

    szukalem jasnego opisu i znalazlem! pozdrawiam!

  • Irek

    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.

  • Pietia

    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 !

  • w

    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.

  • LuckyLuke

    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)

  • Wojtas_Czaj

    Dziękuję, świetny art.

  • rafal

    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

  • tj_gumis

    Bardzo Ci dziekuje.

  • liamt

    Dzięki, bardzo pomocne.

  • Mateusz

    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 )?

  • Krzysiooo

    Czy istnieje cos takiego jak “LEFT INNER JOIN” ?

  • Anonim

    Świetny i konkretny poradnik. Dzięki.

  • oli4

    Czytałem wiele kursów SQL z opisem funkcji ‘inner join’, jednak ten jest zdecydowanie najlepszy. Dziękuję.

  • Kris

    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?

  • Kris

    P.S.

    Daty są zapisywane do kolumny C.

  • Plo

    Świetny artykuł. Teraz wiem jak wyciągać dane z kilku tabel !!! Dzięki pozdrawiam :-)

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>