środa, 3 maja 2017

Lekcja 9. Instrukcja SELECT wykorzystująca klika tabel.

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