Kurs SQL #08: Łączenia w składni SQL/92

W poprzednich postach poznałeś dokładnie czym są złączenia w bazach danych, po co je tworzyć i jak to robić. Tym razem Darmowy Kurs SQL pozwoli Ci poznać popularną składnie SQL/92 dla tego typu złączeń. Nauczysz się używać klauzuli JOIN i USING. Zaczynajmy!

Pierwszy raz tutaj? Zacznij od lekcji numer jeden! Kurs SQL #01: Wprowadzenie i środowisko

eBook Niezbędnik Administratora Baz Danych cover

Nowoczesny Kurs SQL… dlaczego zatem SQL/86?

Kurs SQL dotychczas operował w temacie złączeń na starszej składni SQL/86. Podejście takie miało na celu przygotowanie Cię na spotkanie w pracy z nieco starszym kodem. Od wersji Oracle 9g baza danych obsługuje standard SQL/92. To właśnie z niego należy korzystać przy pisaniu nowych zapytań. Często jednak w przypadku aplikacji napisanych jakiś czas temu, możemy się spotkać z starszą składnią. Nie brakuje też programistów przyzwyczajonych do SQL/86.

Typy złączeń w składni SQL/92

Najłatwiej będzie przerobić zapytania z poprzedniej części kursu, tym razem jednak w nowszej składni.

Złączenia wewnętrzne – INNER JOIN

SQL/86:

select 
    oe.customers.cust_first_name, 
    oe.customers.cust_last_name, 
    oe.orders.order_mode, 
    oe.order_items.quantity, 
    oe.product_information.list_price
from oe.customers, oe.orders, oe.order_items, oe.product_information
where oe.customers.customer_id = oe.orders.customer_id
    and oe.orders.order_id = oe.order_items.order_id
    and oe.order_items.product_id= oe.product_information.product_id;

SQL/92:

select 
    oe.customers.cust_first_name, 
    oe.customers.cust_last_name, 
    oe.orders.order_mode, 
    oe.order_items.quantity, 
    oe.product_information.list_price
from 
    oe.customers 
    inner join oe.orders on oe.customers.customer_id = oe.orders.customer_id
    inner join oe.order_items on oe.orders.order_id = oe.order_items.order_id
    inner join oe.product_information on oe.order_items.product_id = oe.product_information.product_id;

Jak widzisz składnia jest bardziej przejrzysta. Eliminuje ona także całkowicie warunek WHERE potrzebny wcześniej do wykonania złączenia. Klauzula INNER JOIN informuje o chęci wykonania złączenia wewnętrznego z tabelą podaną po niej. Następnie po klauzuli ON należy podać kolumny będące kluczami w łączonych tabelach. Obydwa zapytania zwrócą oczywiście ten sam wynik 😉

Złączenia zewnętrzne – OUTER JOIN

SQL/86:

select 
    oe.order_items.order_id,
    oe.product_information.product_name
from oe.order_items, oe.product_information 
where oe.order_items.product_id (+) = oe.product_information.product_id 
order by 1 desc;

SQL/92:

select 
    oe.order_items.order_id,
    oe.product_information.product_name
from 
    oe.order_items
    left outer join oe.product_information on oe.order_items.product_id = oe.product_information.product_id
order by 1;

Powyżej widzisz poznane przez Ciebie wcześniej zapytanie w składni SQL/92. Dla przypomnienia zapytanie to pobiera z tabel ORDER_ITEMS i PRODUCT_INFORMATION dane na temat zamówionych produktów. Zależy nam na pozyskaniu pełnej listy produktów, nawet jeżeli nie można do któregoś z nich przyporządkować informacji o zamówieniu. W nowszej składni zamiast poznanych już przez Ciebie znaków (+) stosujemy klauzulę LEFT OUTER JOIN. Oznacza ona chęć wykonania złączenia zewnętrznego. Przetestuj obydwa zapytania i przekonaj się samodzielnie że zwracają one dokładnie ten sam wynik!

Zadanie do samodzielnego wykonania

Pamiętasz zapewne, że znak (+) przy złączeniach można było stawiać po każdej z stron. W przypadku składni SQL/92 mamy LEFT OUTER JOIN… i oczywiście RIGHT OUTER JOIN. W ramach ćwiczenia stwórz samodzielnie zapytanie wykorzystujące poznane przez Ciebie tabele, tak aby wykorzystać klauzule RIGHT OUTER JOIN. Pochwal się swoim zapytaniem w komentarzu pod tym postem! 😀

Złączenia własne w składni SQL/92

Oczywiście nowsza składnia przewiduje także złączenia własne.

SQL/86:

select w.first_name || ' ' || w.last_name || ' jest podwładnym ' || m.first_name || ' ' || m.last_name
from hr.employees w, hr.employees m 
where w.manager_id = m.employee_id 
order by w.first_name;

SQL/92:

select w.first_name || ' ' || w.last_name || ' jest podwładnym ' || m.first_name || ' ' || m.last_name
from hr.employees w
    inner join hr.employees m on w.manager_id = m.employee_id 
order by 1;

Jeżeli chcesz kompleksowo poznać administrację bazą danych PostgreSQL lub planujesz ścieżkę zawodową DBA, wejdź tutaj: Praktyczna Administracja PostgreSQL


Klauzula USING

Wróćmy na chwile jeszcze do zapytania w którym łączyliśmy wiele tabel. Pamiętasz też zapewne aliasy którymi upraszczaliśmy zapytania. Czy nasze zapytania w SQL/92 da się uprościć? Oczywiście, że tak!

select 
    c.cust_first_name, 
    c.cust_last_name, 
    o.order_mode, 
    oi.quantity, 
    pi.list_price
from 
    oe.customers c 
    inner join oe.orders o USING(customer_id)
    inner join oe.order_items oi USING(order_id)
    inner join oe.product_information pi USING(product_id);

Zastosowałem powyżej aliasy… i nową klauzule USING! Pozwala ona na pominięcie części standardowej składni. Możesz jej używać kiedy nazwy kolumn biorących w złączeniu są takie same. Miedzy innymi dla tego dobry design struktury danych w bazie jest tak istotny 😉

W kolejnej części Darmowego Kursu SQL poznasz różne przydatne funkcje języka SQL.


Część dziewiąta kursu dostępna! Kurs SQL #09: Funkcje jednowierszowe