BD-1st-2.4-lab4.tresc-1.1-Slajd18
Połączenia zewnętrzne – cd.
Ogólna składnia połączeń zewnętrznych wygląda następująco:
SELECT relacja1.atrybut, alias2.atrybut.........
FROM relacja1 [alias1] [NATURAL] {LEFT|RIGHT|FULL} [OUTER] JOIN relacja2 [alias2] {ON (warunek_połączenia1) | USING (atrybut) | o}
WHERE ....
ORDER BY .....
Aby zilustrować sposób tworzenia zapytań zewnętrznych, przedstawiono na slajdzie kilka przykładowych zapytań.
1. Zapytanie (1)
SELECT nazwa, nazwisko, etat
FROM zespoly z RIGHT OUTER JOIN pracownicy p
ON z.id_zesp= p.id_zesp;
W powyższym zapytaniu, relacje łączone są za pomocą operatora RIGHT OUTER JOIN. Znaczy to, że relacje ZESPOLY i PRACOWNICY będą łączone za pomocą połączenia zewnętrznego, a relacja, z której wszystkie krotki mają się znaleźć w wyniku połączenia, to relacja po prawej stronie operatora (RIGHT OUTER JOIN), czyli relacja PRACOWNICY. Takie połączenia nazywane są „połączeniami zewnętrznymi prawostronnymi”. Prócz tego, że jest to połączenie zewnętrzne, jest to typowe połączenie równościowe, gdyż warunek połączeniowy korzysta z operatora równości. W ogólności jednak może to być dowolny operator, a zatem ta składnia nadaje się również do definiowania „zewnętrznych połączeń nierównościowych”.
2. Zapytanie (2)
SELECT nazwa, nazwisko, etat
FROM zespoly z NATURAL LEFT JOIN pracownicy p;
W powyższym zapytaniu, relacje łączone są za pomocą operatora NATURAL LEFT JOIN. Znaczy to, że relacje ZESPOLY i PRACOWNICY będą łączone za pomocą naturalnego połączenia zewnętrznego, a relacja, z której wszystkie krotki mają się znaleźć w wyniku połączenia, to relacja po lewej stronie operatora (LEFT JOIN), czyli relacja ZESPOLY. Takie połączenia nazywane są „połączeniami zewnętrznymi lewostronnymi”. Ponieważ mamy do czynienia z połączeniem naturalnym, warunkiem połączeniowym jest tutaj równość wartości na atrybutach o takich samych nazwach. Dodatkowo, ponieważ jest to połączenie zewnętrzne lewostronne, wszystkie krotki z relacji ZESPOLY znajdą się w wyniku połączenia. Należy tutaj zwrócić uwagę na jeszcze dwie rzeczy. Otóż, jak łatwo zauważyć, pominięto w zapytaniu słowo kluczowe OUTER. Słowo to jest nieobowiązkowe, a o tym, czy połączenie jest zewnętrzne, czy nie, decyduje obecność słowa kluczowego RIGHT, LEFT albo FULL (patrz poniżej). Drugą rzeczą jest fakt, iż pod względem funkcjonalnym połączenia lewostronne i prawostronne się niczym nie różnią, gdyż można zamienić kolejność nazw relacji w zapytaniu, zmieniając tym samym wynik połączenia w taki sam sposób w jaki zmieniłaby go zamiana operatora połączenia lewostronnego na operator połączenia prawostronnego.
3. Zapytanie (3)
SELECT nazwa, nazwisko, etat
FROM zespoly FULL OUTER JOIN pracownicy
USING (id_zesp);
W powyższym zapytaniu, relacje łączone są za pomocą operatora FULL OUTER JOIN, a za nazwą drugiej relacji użyto słowa kluczowego USING i podano atrybut ID_ZESP. Znaczy to, że relacje ZESPOLY i PRACOWNICY będą łączone za pomocą naturalnego połączenia zewnętrznego. Ten przykład pokazuje specjalny typ połączenia zewnętrznego, w którym żądamy, aby wszystkie krotki z obu relacji pojawiły się w wyniku połączenia przynajmniej raz (FULL OUTER JOIN). Takie połączenia nazywane są „połączeniami zewnętrznymi pełnymi”. Wynik takiego połączenia można najłatwiej zrozumieć jako sumę wyników połączenia lewostronnego i prawostronnego:
SELECT nazwa, nazwisko, etat
FROM zespoly LEFT OUTER JOIN pracownicy
USING (id_zesp)
UNION
SELECT nazwa, nazwisko, etat
FROM zespoly RIGHT OUTER JOIN pracownicy
USING (id_zesp);
Ponieważ mamy do czynienia z połączeniem naturalnym, warunkiem połączeniowym jest tutaj równość wartości na atrybucie ID_ZESP w obu łączonych relacjach.
W ogólności podział typów połączeń ze względu na to które krotki trafiają do relacji wynikowej (wewnętrzne, zewnętrzne - lewostronne, prawostronne, pełne) jest ortogonalny względem podziału połączeń ze względu na warunek połączenia (równościowe, naturalne, nierównościowe). Każdą z kombinacji tych typów połączeń można skonstruować (za wyjątkiem połączenia typu iloczyn kartezjański, który jest zupełnie osobnym typem połączenia).