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
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 preferujesz naukę prze oglądanie materiałów video zachęcam Cię do sprawdzenia mojego Kursu online SQL w Praktyce!
Kurs dostępny pod linkiem: Kurs SQL
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