BD-1st-2.4-lab4.tresc-1.1-Slajd8
Połączenia równościowe
Problem, o którym wspomniano na początku niniejszej prezentacji, polegający na znalezieniu dla każdego pracownika nazwy jego zespołu można rozwiązać za pomocą tzw. „połączenia równościowego” ( equi join ). W wyniku połączenia równościowego powstaje relacja, która zawiera wszystkie atrybuty z obu łączonych relacji, jednak, w przeciwieństwie do iloczynu kartezjańskiego, krotki w takiej relacji są konstruowane w inny sposób. Powstają one poprzez znalezienie wszystkich par krotek, z których jedna pochodzi z pierwszej łączonej relacji, a druga z drugiej i spełniają one tzw. „warunek połączenia”. Każda taka para jest łączona i tworzy nową krotkę w relacji wynikowej. Ważne jest, aby warunki połączeniowe porównywały jedynie wartości atrybutów pochodzących z łączonych relacji. W połączeniach równościowych warunki te muszą być oparte o operator równości (‘=‘). Podobnie jak w przypadku iloczynów kartezjańskich, połączenie równościowe jest również definiowane w klauzuli FROM:
SELECT relacja1.atrybut, alias2.atrybut.........
FROM relacja1 [alias1] JOIN relacja2 [alias2] ON warunek_połączenia
WHERE ....
ORDER BY .....
W celu dokładniejszego zilustrowania ogólnej składni przedstawionej powyżej omówmy przykład pokazany na slajdzie:
SELECT pracownicy.nazwisko, z.nazwa, z.id_zesp
FROM pracownicy JOIN zespoly z ON (pracownicy.id_zesp=z.id_zesp);
Powyższe zapytanie jest rozwiązaniem problemu zdefiniowanego na początku tej prezentacji, który polegał na odnalezieniu dla każdego pracownika,nazwy jego zespołu. Nazwę zespołu pracownika można zidentyfikować korzystając z numeru zespołu (atrybut ID_ZESP), który jest każdemu pracownikowi przypisany. W relacji ZESPOLY również, dla każdego zespołu, zdefiniowano jego numer (również atrybut ID_ZESP). Oczywistym wydaje się zatem, że warunek połączeniowy tych relacji powinien być oparty o równość tych dwóch atrybutów. Przeanalizujmy najpierw klauzulę FROM. Relacje PRACOWNICY i ZESPOLY są łączone za pomocą operatora JOIN, a warunek połączenia podawany jest za słowem kluczowym ON. Przy definicji warunku połączeniowego można napotkać na pewien problem. Otóż nazwy atrybutów, według których łączone są relacje, są takie same w obu relacjach. Konieczny jest zatem jakiś mechanizm pozwalający na rozróżnienie z których relacji pochodzą atrybuty wykorzystane w warunku. Jeżeli przyjrzymy się warunkowi połączeniowemu na przykładzie, możemy zobaczyć, że nazwę atrybutu pochodzącego z relacji PRACOWNICY poprzedzono nazwą relacji oddzieloną od nazwy atrybutu kropką. Z kolei atrybut pochodzący z drugiej relacji poprzedzono literą Z i kropką. Jeżeli przyjrzymy się nazwie relacji ZESPOLY, wymienionej po słowie kluczowym JOIN, możemy zauważyć, że za tą nazwą podano tą samą literę. Litera ta stanowi tzw. „alias”, czyli alternatywną nazwę dla relacji wykorzystywaną w zapytaniu. Stąd Z.ID_ZESP jest równoważne ZESPOLY.ID_ZESP i oznacza atrybut ID_ZESP z relacji ZESPOLY. Aliasy są opcjonalne i najczęściej składają się z jednej do dwóch liter. Stosuje się je dla skrócenia zapisu zapytania oraz do zapobiegania niejednoznaczności w bardziej skomplikowanych zapytaniach. W podobny sposób należy poprzedzać nazwy atrybutów (aliasami albo nazwami relacji) w wyrażeniach w klauzulach: SELECT, WHERE, albo ORDER BY. Stąd też, w klauzuli SELECT, w przykładowym zapytaniu, nazwy atrybutów, które miały się znaleźć w relacji wynikowej, są poprzedzone aliasami, bądź nazwami relacji. Należy tutaj jeszcze zaznaczyć, że poprzedzanie nazw atrybutów aliasami, bądź nazwami relacji jest obowiązkowe jedynie w sytuacji, gdy nie zrobienie tego prowadzi do niejednoznaczności. Należy również pamiętać, że jeżeli zdefiniowano alias, to nie wolno już korzystać z oryginalnej nazwy relacji.