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
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!
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
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_ID | CUSTOMER_ID | ORDER_TOTAL | PROMOTION_ID |
---|---|---|---|
2458 | 101 | 78279.6 | – |
2397 | 102 | 42283.2 | – |
2454 | 103 | 6653.4 | – |
2354 | 104 | 46257 | – |
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_ID | CUST_FIRST_NAME | CUST_LAST_NAME | CUST_EMAIL |
---|---|---|---|
144 | Sivaji | Landis | Sivaji.Landis@GOLDENEYE.EXAMPLE.COM |
145 | Mammutti | Pacino | Mammutti.Pacino@GREBE.EXAMPLE.COM |
146 | Elia | Fawcett | Elia.Fawcett@JACANA.EXAMPLE.COM |
147 | Ishwarya | Roberts | Ishwarya.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_ID | CUST_FIRST_NAME | CUST_LAST_NAME |
---|---|---|
120 | Diane | Higgins |
select
order_id, customer_id, order_total, promotion_id
from oe.orders
where customer_id = 120;
ORDER_ID | CUSTOMER_ID | ORDER_TOTAL | PROMOTION_ID |
---|---|---|---|
2373 | 120 | 416 | – |
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_ID | CUST_FIRST_NAME | CUST_LAST_NAME | ORDER_TOTAL |
---|---|---|---|
120 | Diane | Higgins | 416 |
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ń