Kurs SQL #06: Łączenie tabel

Darmowy Kurs SQL zaczyna wchodzić w bardziej zaawansowane zagadnienia! Tym razem przygotowałem dla Ciebie informacje na temat pobierania danych z dwóch tabel. Łączenie tabel w SQL wykorzystujemy regularnie przy pracy z bazami danych. Jest to jednocześnie nieco bardziej rozbudowany temat. Dla Twojej wygody całe zagadnienie postanowiłem podzielić na kilka lekcji. Zaczynajmy pierwszą z nich!

Dopiero dowiedziałeś się o Darmowym Kursie SQL? Aby zacząć od pierwszej lekcji wejdź tutaj: Kurs SQL #01: Wprowadzenie i środowisko

eBook Niezbędnik Administratora Baz Danych cover

Relacje między tabelami

W poprzednich częściach Darmowego Kursu SQL pokazałem Ci jak pobierać dane pojedynczej tabeli. Bazy danych nazywamy relacyjnymi nie bez powodu 😉 Jak sama nazwa wskazuje posiadają one relacje między tabelami. W związku z tym często pobieramy dane z kilku tabel jednocześnie.

Zastanawiasz się pewnie, jak to wygląda na realnym przykładzie. Już tłumacze! Pojedyncza baza danych może zawierać informacje dotyczące np. sklepu internetowego. Wśród tabel w takiej bazie znajduje się zapewne tabela z produktami sklepu, tabela z danymi klientów, czy tabela z informacjami o zamówieniach. Istotną informacją jest, że w bazach danych dążymy do tego, aby nie występowała redundancja(nadmiarowość) danych. Każda tabela ma swoje, jasno określone przeznaczenie!

Tabela z spisem zamówień może przetrzymywać informacje o godzinie zamówienia, czy rabacie. Nie powinna natomiast przechowywać danych klienta, z wyjątkiem jednej kolumny w której powinien być „namiar” na niego. Taki namiar przeważnie to numer porządkowy, często określany jako ID. Jak widzisz między tabelą klientów i zamówień zachodzi relacja 🙂

Gdy potrzebujemy sprawdzić jak na imię miał klient składający dane zamówienie, piszemy zapytanie wykorzystujące łączenie tabel. Takim zapytaniem możemy pobrać np. godzinę zamówienia z tabeli z zamówieniami i nazwisko klienta z tabeli z klientami. Zobaczmy jak to wygląda w praktyce!


Poznaj bazy danych Oracle od strony administracji i zarządzania nimi – przejdź kompleksowy kurs: Praktyczna Administracja Oracle Database!


Klucz główny i obcy

Przyjrzymy się tabelom z schematu OE, które opisują sklep który wcześniej wspomniałem.

select 
    order_id, customer_id, order_total, promotion_id 
from oe.orders;
ORDER_IDCUSTOMER_IDORDER_TOTALPROMOTION_ID
245810178279.6
239710242283.2
24541036653.4
235410446257

Dokładnie tak jak mówiłem, tabela ORDERS posiada kolumnę CUSTOMER_ID. Przechowuje ona ID klienta. Zajrzymy zatem do tabelki CUSTOMERS.

select 
    customer_id,cust_first_name,cust_last_name, cust_email 
from oe.customers;
CUSTOMER_IDCUST_FIRST_NAMECUST_LAST_NAMECUST_EMAIL
144SivajiLandisSivaji.Landis@GOLDENEYE.EXAMPLE.COM
145MammuttiPacinoMammutti.Pacino@GREBE.EXAMPLE.COM
146EliaFawcettElia.Fawcett@JACANA.EXAMPLE.COM
147IshwaryaRobertsIshwarya.Roberts@LAPWING.EXAMPLE.COM

Chyba widzisz już jak można połączyć te dane 😉 W bazach danych relacje tego typu mają tzw. klucze główne i obce. Kluczem głównym w CUSTOMERS jest CUSTOMER_ID. Dla tabeli ORDERS z kolei kolumna CUSTOMERS_ID jest kluczem obcym.

Kolumna która pełni rolę klucza głównego:

  • przetrzymuje wartości unikalne
  • dla każdego wiersza ma wpisaną wartość
  • wpisana wartość nie ulega zmianie

Wymienione wyżej reguły w praktyce oznaczają, że tabela CUSTOMERS w kolumnie CUSTOMERS_ID nie ma dwóch rekordów z tym samym CUSTOMER_ID. Każdy klient ma swój unikalny ID identyfikujący go jednoznacznie. Każdy wiersz tej tabeli posiada podane CUSTOMER_ID i nie możemy modyfikować tej wartości.

Klucz obcy z kolei to kopia danych klucza głównego, mająca pozwolić na utworzenie relacji między danymi w różnych tabelach 😉 W dobrze zaprojektowanej bazie danych klucze obce są jedynymi kolumnami gdzie przetrzymywane są zduplikowane dane względem innych tabel i ich kolumn.

Łączenie tabel w standardzie ANSI/SQL86

Załóżmy że chcemy znaleźć informacje na temat zamówienia złożonego przez użytkownika o CUSTOMER_ID równym 120. Zróbmy to najpierw w dwóch zapytaniach.

select 
    customer_id,cust_first_name,cust_last_name
from oe.customers
where customer_id = 120;
CUSTOMER_IDCUST_FIRST_NAMECUST_LAST_NAME
120DianeHiggins
select 
    order_id, customer_id, order_total, promotion_id 
from oe.orders
where customer_id = 120;
ORDER_IDCUSTOMER_IDORDER_TOTALPROMOTION_ID
2373120416

Jak widać taka forma nie jest optymalna, wykorzystujemy zatem łączenie tabel 😉

select 
    customers.customer_id, customers.cust_first_name, customers.cust_last_name, orders.order_total
from oe.customers, oe.orders
where customers.customer_id = orders.customer_id
and customers.customer_id = 120;
CUSTOMER_IDCUST_FIRST_NAMECUST_LAST_NAMEORDER_TOTAL
120DianeHiggins416

Jak widzisz utworzenie łączenia tabel wymaga podania w klauzuli FROM nazw obydwu tabel oddzielonych przecinkiem. Dodatkowo w warunku WHERE należy podać po jakich kolumnach je łączymy. Warunek ten posiada zawsze podany klucz główny jednej z tabel i obcy drugiej. Jako że interesuje Nas tylko jeden konkretny klient, dodałem jeszcze warunek CUSTOMER_ID = 120.

Zauważyłeś pewnie że nazwy kolumn otrzymały przedrostki w postaci nazw tabel z których pochodzą. Jest to konieczny zabieg, nic przecież nie stoi na przeszkodzie, aby w dwóch różnych tabelach występowała kolumna o tej samej nazwie. Dlatego też należy wskazywać kolumny dokładnie przez dodanie nazwy tabeli.

Aliasy i łączenie tabel

Wpisywanie nazw kolumn wraz z nazwami ich tabel może być dosyć mozolne. Aby ułatwić zadanie język SQL przewiduje możliwość użycia aliasów. Poniżej znajdziesz zmodyfikowaną wersję poprzedniego zapytania z wykorzystaniem aliasów.

select 
    c.customer_id, c.cust_first_name, c.cust_last_name, o.order_total
from oe.customers c , oe.orders o
where c.customer_id = o.customer_id
and c.customer_id = 120;

W klauzuli FROM dodałem listerę C dla tabeli CUSTOMERS i O dla ORDERS. Dzięki temu mogłem skrócić nazwy kolumn użytych w zapytaniu 🙂

W kolejnych lekcjach Darmowego Kursu SQL pokaże Ci jak pobierać dane z więcej niż dwóch tabel jednocześnie, a także poznasz łączenia tabel w standardzie SQL/92.


Siódma część kursu dostępna! Kurs SQL #07: Łączenie wielu tabel i typy złączeń