1
1
Łączenie tabel i
Łączenie tabel i
podzapytania.
podzapytania.
(Join, Union
(Join, Union
, select
, select
)
)
Prezentacja do ćwiczenia 9
Prezentacja do ćwiczenia 9
Materiały wykorzystane w przykładach:
Materiały wykorzystane w przykładach:
Materiały pomocnicze do ćwiczeń laboratoryjnych\Ćwiczenie 9
Materiały pomocnicze do ćwiczeń laboratoryjnych\Ćwiczenie 9
2
2
Zakres ćwiczeń
Prezentacja przybliży zagadnienia związane z tworzeniem zapytań łączących
Prezentacja przybliży zagadnienia związane z tworzeniem zapytań łączących
kilka tablic w celu uzyskania jednego wynikowego zbioru danych.
kilka tablic w celu uzyskania jednego wynikowego zbioru danych.
Poruszono problem zagnieżdżonych instrukcji SELECT i stosowania instrukcji
Poruszono problem zagnieżdżonych instrukcji SELECT i stosowania instrukcji
SELECT jako uzupełniające kryterium wyszukiwania.
SELECT jako uzupełniające kryterium wyszukiwania.
W celu utrwalenia wiedzy prezentację zakończy ćwiczenie do
W celu utrwalenia wiedzy prezentację zakończy ćwiczenie do
samodzielnego
samodzielnego
wykonania.
wykonania.
3
3
Dane w relacyjnych bazach danych podzielone są na tabele. Proces
normalizacji bazy danych również niesie za sobą konieczność
dzielenia tablic. Prędzej czy później zaistnieje potrzeba łączenia
tablic, w celu uzyskania interesującej nas tabeli wynikowej.
Proces taki nazywamy złączeniem (po anglelsku join). Ze
względu na sposób łączenia dzieli się operacje złączeń na trzy grupy:
• złączenia wewnętrzne
• złączenia zewnętrzne
• złączenia bezwarunkowe (samozłączenia)
Podsumowując:
Złączenia umożliwiają łączenie danych z różnych tabel w pojedynczy
wiersz wynikowy.
Złączenia tabel w języku SQL
4
4
Podstawowe pytanie: jak łączone są ze sobą informacje z dwóch tabel?
Złączenia bezwarunkowe = CROSS JOIN
Tabele mogą różnić się od siebie wszystkimi cechami, nie
narzucanymi przez model relacyjny, a więc: ilością wierszy, ilością
kolumn, oraz ich typami. Kluczem jest pojęcie znane z algebry iloczyn
kartezjański.
Operacje łączenia tabel zawierają w trakcie ich realizacji wstępny etap
utworzenia nowej tabeli, będącej iloczynem kartezjańskim wierszy z
łączonych tabel.
Najprostsze zapytanie, pozwalające się o tym przekonać, ma postać:
SELECT * FROM tabela1, tabela2
Składnia powyższego zapytania oparta jest o standard języka SQL-89.
Nowsza postać róznoważnego zapytania, w standardzie oznaczanym
jako SQL-92, przedstawia się następująco:
SELECT * FROM tabela1 CROSS JOIN tabela2
Złączenia bezwarunkowe
5
5
Złączenie to generuje pełny iloczyn kartezjański obu zbiorów. Każdy
Złączenie to generuje pełny iloczyn kartezjański obu zbiorów. Każdy
wiersz z 1
wiersz z 1
zbioru tworzy wiersz wynikowy z każdym wierszem zbioru .
zbioru tworzy wiersz wynikowy z każdym wierszem zbioru .
Przykład :
Przykład :
Jeżeli 1 zbiór zawiera 10 wierszy, a drugi zawiera 100 wierszy to zbiór
Jeżeli 1 zbiór zawiera 10 wierszy, a drugi zawiera 100 wierszy to zbiór
wynikowy ma 1000 wierszy.
wynikowy ma 1000 wierszy.
Złączenia bezwarunkowe
cd.
6
6
Złączenia wewnętrzne
Złączenia wewnętrzne odnoszą jeden wiersz w tabeli do jednego
lub większej liczby wierszy w innej tabeli. Każdy wiersz wyniku
złączenia wewnętrznego stanowi połączenie wartości z dwóch
związanych ze sobą wierszy.
Składnia zapytania wykorzystującego złączenie wewnętrzne
(INNER JOIN) oparta o standard języka SQL-89 (obecnie używany
jest standard SQL-92) wygląda następująco:
SELECT t1.kolumna1, t2.kolumna2
FROM tabela 1 as t1 INNER JOIN tabela 2 as t2
ON t1.kolumna1 = t2.kolumna2;
Słowo kluczowe INNER JOIN między nazwami tabeli wskazuje, że
złączenie powinno być złączeniem wewnętrznym. Klauzula ON
definiuje natomiast warunek złączenia lub warunek, który musi
oddziaływać na dwa wiersze, aby można było je uznać za
połączone.
Kolejność występowania nazw tabel w złączeniu wewnętrznym nie
ma znaczenia. Słowo INNER jest opcjonalne, te samo zapytanie
bez słowa kluczowego INNER zwróci taki sam rezultat.
7
7
W zapytaniach wykorzystujących złączenia można zastosować klauzulę
WHERE zawierającą dodatkowe kryteria wyszukiwania. W tym
przypadku
zapytanie będzie miało następującą postać:
SELECT t1.kolumna1, t2.kolumna2
FROM tabela 1 as t1 INNER JOIN tabela 2 as t2
ON t1.kolumna1 = t2.kolumna2;
WHERE t1.id_wiersza = 1;
Złączenia wewnętrzne
Złączenia wewnętrzne
8
8
Złączać możemy kilka tablic, zapytanie będzie w tym przypadku
następującej
postaci:
SELECT t1.kolumna1, t2.kolumna2
FROM tabela 1 as t1 INNER JOIN tabela 2 as t2
ON t1.kolumna1 = t2.kolumna2;
INNER JOIN tabela 3 as t3
ON t2.id_wiersza = t3.id_wiersza;
Złączenia takie są realizowane w kolejności od lewej do prawej strony
instrukcji
SQL.
Najpierw tworzy się zbiór wynikowy ze złączenia tablicy 1 oraz tablicy 2 a
on z
kolei łączy się z tablicą 3 dając ostateczny zbiór wynikowy.
Złączenia wewnętrzne
Złączenia wewnętrzne
9
9
Przykład 1:
Przykład 1:
Wyświetlamy wypożyczenia pojazdów dla klienta o nazwisku Uler.
Wyświetlamy wypożyczenia pojazdów dla klienta o nazwisku Uler.
SELECT
SELECT
imie,nazwisko,marka,model
imie,nazwisko,marka,model
FROM
FROM
pojazdy p
pojazdy p
INNER JOIN
INNER JOIN
(klient k
(klient k
INNER JOIN
INNER JOIN
wypozyczenie w
wypozyczenie w
ON
ON
k.id_klienta =
k.id_klienta =
w.id_klienta)
w.id_klienta)
ON
ON
p.id_pojazdy = w.id_pojazdy
p.id_pojazdy = w.id_pojazdy
WHERE
WHERE
nazwisko='Uler';
nazwisko='Uler';
Złączenia wewnętrzne -
przykład
Rysunek 1
10
10
Jak widać z rysunku 1, aby uzyskać interesujący nas rezultat należy wyświetlić
informacje z 4 tablic a co za tym idzie dokonać ich złączenia.
Dla przykładu w tabeli wypożyczenia znajduje się tylko pole id_klienta a brakuje
niektórych informacji np: imienia, nazwiska. Po informacje te należy sięgnąć do
tabeli „klient” dokonując złączenia tablic „wypożyczenia” oraz „klient” złączenie
dokonujemy za pomocą pola „id_klienta” które jest wspólne dla obu złączanych
tabel.
Złączenia wewnętrzne – przykład cd.
11
11
Złączenie zewnętrzne jest typem złączenia, w którym wiersz
Złączenie zewnętrzne jest typem złączenia, w którym wiersz
zbioru wynikowego nie musi zawierać wierszy pochodzących z
zbioru wynikowego nie musi zawierać wierszy pochodzących z
obydwu tabel objętych złączeniem. Jedna lub dwie tabele mają
obydwu tabel objętych złączeniem. Jedna lub dwie tabele mają
charakter opcjonalny. Ten typ złączenia należy stosować w
charakter opcjonalny. Ten typ złączenia należy stosować w
przypadku gdy złączenie powinno zostać wykonane, jeśli tylko jest
przypadku gdy złączenie powinno zostać wykonane, jeśli tylko jest
możliwe. Bez względu na to czy dokonano złączenia czy nie,
możliwe. Bez względu na to czy dokonano złączenia czy nie,
muszą zostać zwrócone pewne wiersze.
muszą zostać zwrócone pewne wiersze.
Złączenia zewnętrzne dzielimy na:
Złączenia zewnętrzne dzielimy na:
•
lewostronne
lewostronne
•
prawostronna
prawostronna
•
pełne złączenia
pełne złączenia
Złączenia zewnętrzne
Złączenia zewnętrzne
12
12
Lewostronne złączenia zewnętrzne są wykorzystywane w
Lewostronne złączenia zewnętrzne są wykorzystywane w
przypadkach, gdy w wyniku muszą zostać zwrócone wszystkie
przypadkach, gdy w wyniku muszą zostać zwrócone wszystkie
wiersze z jednej tabeli niezależnie od tego, czy w drugiej tabeli
wiersze z jednej tabeli niezależnie od tego, czy w drugiej tabeli
znajdują się jakiekolwiek odpowiadające im wiersze.
znajdują się jakiekolwiek odpowiadające im wiersze.
Przykładem może być chęć wyświetlenia klientów i ich
Przykładem może być chęć wyświetlenia klientów i ich
wypożyczeń, którzy nie koniecznie muszą posiadać w danym
wypożyczeń, którzy nie koniecznie muszą posiadać w danym
czasie jakiekolwiek wypożyczenia.
czasie jakiekolwiek wypożyczenia.
Lewostronne złączenia
Lewostronne złączenia
zewnętrzne
zewnętrzne
13
13
Przykład 2:
Przykład 2:
Wyświetlamy klientów którzy na wypożyczenie pojazdów wydali
Wyświetlamy klientów którzy na wypożyczenie pojazdów wydali
kwotę od 100 do 500 zł.
kwotę od 100 do 500 zł.
Lewostronne złączenia
Lewostronne złączenia
zewnętrzne
zewnętrzne
Rysunek 2
SELECT k.imie, k.nazwisko, w.cena
FROM klient AS k
LEFT JOIN wypozyczenie AS w
ON k.id_klienta = w.id_klienta
WHERE w.cena>100 And w.cena<500;
14
14
Znaczenie prawostronnego złączenia zewnętrznego jest niemal identyczne jak i lewostronnego złączenia
Znaczenie prawostronnego złączenia zewnętrznego jest niemal identyczne jak i lewostronnego złączenia
zewnętrznego. Jedyna istotna różnica na umiejscowieniu tablicy z wymaganymi wierszami po prawej
zewnętrznego. Jedyna istotna różnica na umiejscowieniu tablicy z wymaganymi wierszami po prawej
stronie instrukcji złączenia.
stronie instrukcji złączenia.
Przykład 3:
Przykład 3:
--SELECT k.id_klienta, k.imie, k.nazwisko, w.id_wypozyczenie
--SELECT k.id_klienta, k.imie, k.nazwisko, w.id_wypozyczenie
--FROM wypozyczenie as w RIGHT OUTER JOIN klient as k
--FROM wypozyczenie as w RIGHT OUTER JOIN klient as k
--ON k.id_klienta = w.id_klienta
--ON k.id_klienta = w.id_klienta
--WHERE nazwisko ='Uler' ;
--WHERE nazwisko ='Uler' ;
SELECT k.id_klienta, k.imie, k.nazwisko, w.id_wypozyczenie
SELECT k.id_klienta, k.imie, k.nazwisko, w.id_wypozyczenie
FROM klient as k
FROM klient as k
LEFT OUTER JOIN wypozyczenie as w ON k.id_klienta = w.id_klienta
LEFT OUTER JOIN wypozyczenie as w ON k.id_klienta = w.id_klienta
WHERE nazwisko ='Uler' ;
WHERE nazwisko ='Uler' ;
Prawostronne złączenia
Prawostronne złączenia
zewnętrzne
zewnętrzne
15
15
Oba powyższe zapytania z zwracają ten sam wynik (są równoważne).
Oba powyższe zapytania z zwracają ten sam wynik (są równoważne).
Aby się przekonać wykonaj zapytania zawarte w pliku Przykład 3.sql).
Aby się przekonać wykonaj zapytania zawarte w pliku Przykład 3.sql).
W celu uniknięcia niejasności zaleca się stosowane złączeń
W celu uniknięcia niejasności zaleca się stosowane złączeń
lewostronnych.
lewostronnych.
Rysunek 3
Prawostronne złączenia
Prawostronne złączenia
zewnętrzne cd.
zewnętrzne cd.
Zapytanie z przykładu 3 zwraca następujący zbiór wynikowy:
16
16
UNION
UNION
Słowo kluczowe UNION służy do łączenia wyników wykonania
Słowo kluczowe UNION służy do łączenia wyników wykonania
dwóch instrukcji SELECT w jeden zbiór wynikowy. Ze zbioru tego
dwóch instrukcji SELECT w jeden zbiór wynikowy. Ze zbioru tego
eliminowane są wszystkie duplikaty wierszy. W celu zachowania
eliminowane są wszystkie duplikaty wierszy. W celu zachowania
zduplikowanych wierszy stosujemy słowo kluczowe UNION ALL.
zduplikowanych wierszy stosujemy słowo kluczowe UNION ALL.
Przykład 4:
Przykład 4:
Rysunek 4
Pierwsze zapytanie pobiera
klientów którzy mają
jakiekolwiek wypożyczenia
drugie zapytanie pobiera
wszystkich klientów
Słowo kluczowe UNION łączy
oba zbiory wynikowe. Słowo
kluczowe DISTINCT jest tu
zbyteczne ponieważ UNION
i tak odrzuci powtarzające
się wyniki.
SELECT DISTINCT k.imie, k.nazwisko,
k.nr_tel
FROM klient as k
INNER JOIN wypozyczenie as w
ON k.id_klienta = w.id_klienta
UNION
SELECT k.imie, k.nazwisko, k.nr_tel
FROM klient as k
17
17
SELECT w SELECT
SELECT w SELECT
Powyższe zapytanie wyświetla klientów, którzy nie mają żadnych
Powyższe zapytanie wyświetla klientów, którzy nie mają żadnych
wypożyczeń a jednak mimo to są w tabeli klient.
wypożyczeń a jednak mimo to są w tabeli klient.
Przykład 5:
Zastosowanie zagnieżdżonej instrukcji SELECT (SELECT w SELECT)
Pozwala np. na eliminacje pewnego zbioru ze zbioru wynikowego.
Rysunek 5
SELECT imie, nazwisko
FROM klient
WHERE nazwisko NOT IN
(SELECT DISTINCT k.nazwisko
FROM klient as k, wypozyczenie as w
WHERE k.id_klienta = w.id_klienta);
18
18
Ćwiczenia
Ćwiczenia
1. Wyświetl wszystkich pracowników, którzy wypożyczyli
1. Wyświetl wszystkich pracowników, którzy wypożyczyli
skutery (s – skuter w tabeli pojazdy) marki Honda
skutery (s – skuter w tabeli pojazdy) marki Honda
(wykorzystaj inner join)
(wykorzystaj inner join)
2. Wyświetl wszystkie motocykle (m – motocykl w tabeli
2. Wyświetl wszystkie motocykle (m – motocykl w tabeli
pojazdy) o pojemności różnej od 650 cm3 (wykorzystaj
pojazdy) o pojemności różnej od 650 cm3 (wykorzystaj
zagnieżdżoną instrukcję select)
zagnieżdżoną instrukcję select)