BD-1st-2.4-lab4.tresc-1.1-Slajd25

Z Studia Informatyczne
Wersja z dnia 09:01, 9 sie 2006 autorstwa PKrzyzagorski (dyskusja | edycje)
(różn.) ← poprzednia wersja | przejdź do aktualnej wersji (różn.) | następna wersja → (różn.)
Przejdź do nawigacjiPrzejdź do wyszukiwania

Łączenie wielu tabel

Łączenie wielu tabel


Jak wspomniano wcześniej, w wyniku połączenia powstaje relacja, która jest następnie dalej przetwarzana w celu realizacji zapytania (selekcja, projekcja, grupowanie itp.). Ponieważ wynik połączenia jest relacją, to nic nie stoi na przeszkodzie, aby nie można jej było połączyć z kolejną relacją. W ten sposób można wykonywać dowolną liczbę połączeń. Ostateczna składnia polecenia SELECT z uwzględnieniem możliwości definicji dowolnej liczby połączeń wygląda następująco:

SELECT relacja1.atrybut, alias2.atrybut.........

FROM relacja

WHERE ....

ORDER BY .....

Gdzie „relację” można, w sposób rekursywny, zdefiniować następująco:

- nazwa relacji [alias]

- (relacja)

- relacja1 CROSS JOIN relacja2

- relacja1 [NATURAL] [{LEFT|RIGHT|FULL} [OUTER]] JOIN relacja2 {ON (warunek_połączenia1) | USING (atrybut) | o}

Jak łatwo zauważyć, dla każdego połączenia definiowany jest warunek połączenia (za wyjątkiem iloczynu kartezjańskiego). Ponieważ połączeń jest o jedno mniej niż łączonych relacji, tyle też należy w zapytaniu zdefiniować warunków połączeniowych. Dodatkową ważną uwagą jest to, iż operator połączenia jest łączny lewostronnie, chociaż priorytet połączeń można zmieniać za pomocą nawiasów (stąd nawiasy w rekursywnej definicji przedstawionej powyżej).

W celu demonstracji składni poleceń SQL z wieloma połączeniami, przedstawiono na slajdzie dwa przykładowe zapytania. Zacznijmy od analizy zapytania (1).

SELECT

P.NAZWISKO, S.NAZWISKO, E.NAZWA,

PLACA_OD, PLACA_DO, Z. NAZWA

FROM ZESPOLY Z

NATURAL RIGHT OUTER JOIN PRACOWNICY P

JOIN ETATY E ON P.ETAT=E.NAZWA

JOIN PRACOWNICY S ON P.ID_SZEFA=S.ID_PRAC;

W zapytaniu tym mamy do czynienia z trzema połączeniami. Ponieważ w klauzuli FROM nie występują nawiasy, należy przyjąć porządek wykonywania połączeń zgodny z łącznością operatora połączenia (łączność lewostronna). Pierwszym połączeniem, które się wykona jest zatem połączenie tabel ZESPOLY (alias Z) i PRACOWNICY (alias P) za pomocą połączenia naturalnego, zewnętrznego prawostronnego. Ponieważ jedynymi atrybutami o takich samych nazwach w obu tych relacjach są atrybuty o nazwie ID_ZESP, relacje te są łączone równościowo według warunku Z.ID_ZESP=P.ID_ZESP. Ponieważ jest to połączenie zewnętrzne prawostronne, to wszystkie krotki z relacji PRACOWNICY znajdą się w wyniku połączenia. W wyniku połączenia otrzymujemy relację, w której każdemu pracownikowi przypisano dane związane z jego zespołem. Pracownicy, którzy nie zostali przypisani do zespołu mają w tych miejscach wartości puste (NULL). Wynik pierwszego połączenia jest następnie łączony z tabelą ETATY (alias E) za pomocą wewnętrznego połączenia równościowego według warunku P.ETAT=E.NAZWA. W wyniku tego połączenia każdemu pracownikowi przypisano dodatkowo dane dotyczące minimalnej i maksymalnej płacy, jaką może otrzymywać ze względu na swój etat. Ostatecznie, wynik poprzednich połączeń jest łączony z relacją PRACOWNICY (alias S) za pomocą równościowego, lewostronnego połączenia zewnętrznego z warunkiem połączenia P.ID_SZEFA=S.ID_PRAC. Z warunku połączenia wynika, że każdemu z pracowników, znajdujących się w wyniku poprzednich połączeń, zostaną przypisane dodatkowo dane dotyczące jego szefa. Połączenie zewnętrzne zastosowano, aby zachować w wyniku wszystkich pracowników (również tych, którzy szefa nie posiadają). Z relacji otrzymanej w wyniku wszystkich połączeń wybierane są atrybuty reprezentujące: nazwisko pracownika (P.NAZWISKO), nazwisko szefa (S.NAZWISKO), nazwę etatu pracownika (E.NAZWA), minimalną i maksymalną płacę na etacie (PLACA_OD i PLACA_DO) oraz nazwę zespołu pracownika, które ostatecznie są zwracane w postaci relacji wynikowej.

Przejdźmy obecnie do drugiego przykładowego zapytania (2):

SELECT NAZWISKO, PLACA_OD, PLACA_DO, Z. NAZWA

FROM ZESPOLY Z FULL OUTER JOIN

(PRACOWNICY P JOIN ETATY E ON P.ETAT=E.NAZWA) ON

P.ID_ZESP = Z.ID_ZESP;

W zapytaniu tym priorytet połączeń został zmodyfikowany za pomocą nawiasów. Pierwszym wykonywanym połączeniem jest równościowe połączenie wewnętrzne pomiędzy relacjami PRACOWNICY i ETATY. W wyniku takiego połączenia powstaje relacja, w której każdemu pracownikowi przypisane są widełki jego płacy wynikające z jego etatu. Wynik tego połączenia jest następnie łączony za pomocą pełnego zewnętrznego połączenia równościowego z relacją ZESPOLY, w wyniku czego otrzymujemy relację, w której każdemu pracownikowi przypisano dane dotyczące zespołu, w którym jest zatrudniony. Jeżeli pracownik nie jest zatrudniony w żadnym zespole, ma w tym miejscu wartości puste. Również każdy zespół znajduje się w wyniku przynajmniej raz, i jeżeli żaden pracownik nie jest do niego przypisany, to w atrybutach dotyczących pracowników zapisane są wartości puste.


<< Poprzedni slajd | Spis treści | Następny slajd >>