Instrukcje SELECT
wykorzystujące dwie tabele
Schematy bazy danych zawierają zwykle więcej niż jedną
tabelę. Na przykład w schemacie employee znajdują
się tabele przechowujące informacje o pracownikach, klientach, zarobkach itd.
Jak dotąd wszystkie zapytania przedstawione w tym kursie pobierały wiersze
tylko z jednej tabeli. W rzeczywistości często chcemy pobrać dane z kilku
tabel. Możemy na przykład chcieć uzyskać nazwę klienta, kraj oraz walutę w obowiązującą
w tym kraju.
W tej lekcji nauczysz się tworzyć zapytania
wykorzystujące dwie tabele. Dowiesz się także, jak wykorzystywać zapytania
pracujące na jeszcze większej liczbie tabel.
Powróćmy do naszego przykładu. Załóżmy, że chcemy
pobrać nazwę klienta o numerze 1007 oraz
kraj i walutę obowiązującą w tym kraju. Nazwa oraz kraj klienta jest przechowywana
w kolumnie customer oraz country tabeli customer, a waluta – w kolumnie currency
tabeli country. Tabele są ze sobą
powiązane za pośrednictwem kolumny klucza obcego country. Kolumna ta (klucz obcy) w tabeli customer wskazuje na kolumnę country
(klucz główny) tabeli country.
Poniższe zapytanie pobiera z tabeli customer kolumny customer i country dla
klienta o numerze 1007:
Następne zapytanie pobiera z tabeli country kolumnę currnecy dla country równego
USA:
Dowidzieliśmy się, że klient numer 1007 mieszka w USA,
a obowiązująca tam walutą jest dolar. Musieliśmy w tym celu wykonać dwa
zapytania. Możemy jednak otrzymać takie same informacje stosując jedno
zapytanie. W takiej sytuacji należy zastosować w zapytaniu złączenie tabel. Aby to zrobić, należy dołączyć obie tabele do
klauzuli FROM zapytania, a także
uwzględnić odpowiednie kolumny ze wszystkich tabel w klauzuli WHERE.
W naszym przykładzie klauzula FROM będzie miała postać:
Natomiast klauzula WHERE:
Złączenie jest
pierwszym warunkiem klauzuli WHERE (customer.country = country.country).
Najczęściej w złączeniu są stosowane kolumny będące kluczem głównym jednej
tabeli i kluczem obcym drugiej tabeli. Drugi warunek w klauzuli WHERE (customer.cust_no = 1007) pobiera klienta o numerze 1007.
Jak możemy zauważyć, w klauzuli WHERE są umieszczone
zarówno nazwy kolumn, jak i tabel. Jest to spowodowane tym, że kolumna country znajduje się i w tabeli customer, i country, musimy więc w jakiś sposób określić tabelę z kolumną,
której chcemy użyć. Gdyby kolumny miały różne nazwy, moglibyśmy pominąć nazwy
tabel, należy jednak zawsze je umieszczać, aby było jasne, skąd pochodzi dana
kolumna.
Klauzula SELECT w
naszym zapytaniu będzie miała postać:
Zapytanie zatem ma postać:
To jedno zapytanie zwraca nazwę klienta, kraj i walutę
obowiązującą w tym kraju. Kolejne zapytanie pobiera wszystkich klientów i
porządkuje ich według kolumny customer.customer:
Używanie aliasów
tabel
Powyżej utworzyliśmy następujące zapytanie:
Możemy zauważyć, że nazwy tabel customer i country
zostały użyte zarówno w klauzuli SELECT, jak
i WHERE. Możliwe jest zdefiniowanie
aliasów tabel w klauzuli FROM i
korzystanie z nich, gdy odwołujemy się do tabeli w innych miejscach w
zapytaniu.
Na przykład w poniższym zapytaniu użyto aliasu cu dla tabeli customer i co dla tabeli country. Należy zauważyć, że aliasy są definiowane w klauzuli FROM i
umieszczane przed nazwami kolumn w innych fragmentach zapytania:
Aliasy tabel zwiększają czytelność zapytań, zwłaszcza
gdy piszemy długie zapytania, wykorzystujące wiele tabel.
Iloczyny
kartezjańskie
Jeżeli warunek złączenia nie zostanie zdefiniowany,
złączone zostanę wszystkie wiersze z jednej tabeli ze wszystkimi wierszami
drugiej. Taki zestaw wyników nazywamy iloczynem kartezjańskim.
Załóżmy, że w jednej tabeli znajduje się 30 wierszy, a
w drugiej 20. Jeżeli wybierzemy kolumny z tych tabel bez warunku złączenia,
otrzymamy w wyniku 600 wierszy (30 * 20), ponieważ każdy wiersz z pierwszej
tabeli zostanie złączony z każdym wierszem z drugiej tabeli.
Poniższy przykład przestawia fragment iloczynu
kartezjański tabel customer i country:
Zapytanie zwróciło 240 wierszy, ponieważ tabela customer zawiera 15 wierszy, a
tabela country zawiera 16 wierszy.
Wynika to z prostych obliczeń 15 * 16 = 240.
Instrukcje SELECT
wykorzystujące więcej niż dwie tabele
Złączenia mogą obejmować dowolną liczbę tabel. Liczba
złączeń potrzebnych w klauzuli WHERE jest
równa liczbie tabel wykorzystywanych w zapytaniu – 1.
Rozważmy bardziej skomplikowany przykład, wykorzystujące
cztery tabele, który pobierze:
- imię oraz nazwisko pracownika (z tabeli employee),
- nazwę działu, w którym pracuje (z tabeli department),
- stanowisko, na którym pracuje (z tabeli job) ,
- walutę kraju, w którym pracuje (z tabeli country).
Korzystamy z czterech tabel i dlatego potrzebujemy trzech
złączeń. Poniżej zostały wymienione konieczne złączenia:
- Aby uzyskać informacje na temat działu, w którym pracuje dany pracownik, musimy złączyć tabele employee i department, wykorzystują kolumny dept_no (employee.dept_no = department.dept_no).
- Aby dowiedzieć się na jakim stanowisku pracuje dany pracownik, musimy złączyć tabele employee i job, wykorzystując kolumny job_code (employee.job_code = job.job_code).
- Aby uzyskać walutę kraju w którym pracuje dany pracownik, musimy złączyć tabele job i country, wykorzystując kolumny job_country i country (job.job_country = country.country).
Te złączenia zostały zastosowane w poniższym zapytaniu,
które pobiera wszystkie ww. dane dla pracownika o numerze 2 (employee.emp_no = 2) :
Prezentowane dotychczas zapytania pobierające dane z wielu
tabel wykorzystywały w warunkach złączenia operator równości (=), były to więc równozłączenia.
Brak komentarzy:
Prześlij komentarz