background image

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

background image

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.

background image

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

background image

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

background image

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.

background image

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.

background image

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

background image

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

background image

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

background image

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.

background image

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

background image

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

background image

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;

background image

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

background image

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:

background image

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

background image

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);

background image

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)


Document Outline