(Microsoft PowerPoint - TBD_s_w6_student [tryb zgodno\234ci])

Transkrypt

(Microsoft PowerPoint - TBD_s_w6_student [tryb zgodno\234ci])
Plan wykładu
• Algebra relacji
Technologie baz danych
–
–
–
–
Wykład 6: Algebra relacji. SQL - cd
operacje teoriomnogościowe
rzutowanie
selekcja
przemianowanie
• SQL
– Podzapytania skorelowane
– Podzapytania w klauzuli HAVING
Małgorzata Krętowska
Wydział Informatyki
Politechnika Białostocka
2
Pojęcie algebry relacji
Operacje w algebrze relacji
• Działania algebry zbiorów: suma, przecięcie i różnica
zastosowane do relacji
• Algebra relacji obejmuje metody tworzenia nowych, bardziej
skomplikowanych relacji na podstawie innego zbioru relacji.
Wyróżniamy tutaj:
• Operacje zawężania relacji: selekcja eliminuje pewne wiersze a
rzutowanie niektóre kolumny
– wyrażenie(operand) - relacja, przedstawiona w postaci nazwy relacji
lub jej krotek
– operatory - różnego typu procedury, które pozwalają na uzyskanie
nowych relacji
• Operacje komponowania krotek pochodzących z różnych relacji,
np. iloczyn kartezjański
• Algebra relacji jest podstawowym przykładem języka zapytań.
• Operacje przemianowania, które nie zmieniają krotek relacji, ale
jej schemat, tzn. nazwy atrybutów lub/i nazwę relacji
3
4
Suma zbiorów
Przecięcie zbiorów
• R∪S - suma zbiorów R i S jest zbiorem elementów, z których
każdy należy do zbioru R lub do zbioru S, lub do obu
równocześnie. Jeśli jakiś element należy do obu zbiorów, w
sumie tych zbiorów występuje tylko raz.
• R∩S - przecięcie zbiorów R i S jest takim zbiorem, do którego
należą tylko te elementy, które występują zarówno w zbiorze S
jak i w R.
• Odpowiednik w SQL
• Odpowiednik w SQL:
select job from emp
where deptno=10
intersect
select job from emp
where deptno=30;
select job from emp
where deptno=10
union
select job from emp
where deptno=30;
union all - nie powoduje eliminacji duplikatów
5
6
Order by w zapytaniach z operatorami
zbiorowymi
Różnica zbiorów
• R-S - różnica zbiorów R i S to zbiór, do którego należą tylko te
elementy ze zbioru R, które nie należą do S.
• Order by umieszcza się na końcu ostatniego polecenia SELECT
• Podajemy numer kolumny według, której chcemy sortować,
ponieważ na listach wyboru mogą występować kolumny o
różnych nazwach
• Odpowiednik w SQL:
select job from emp
where deptno=10
minus
select job from emp
where deptno=30;
SELECT empno, ename, sal
from emp
union
select id, name, salary
from emp_history
order by 2;
7
8
Własności operacji na zbiorach
Rzutowanie
• na listach wyboru składników musi występować taka sama liczba
kolumn
• kolumny występujące na tych samych pozycjach na listach
muszą być tego samego typu
• w wyniku zapytania zostają wyeliminowane powtarzające się
wiersze (wyjątek UNION ALL). Nie można stosować DISTINCT
• nagłówki kolumn wyników zapytania są tworzone na podstawie
pierwszego rozkazu SELECT
• ORDER BY umieszcza się tylko raz na końcu całego złożonego
zapytania
• operatory na zbiorach mogą występować w podzapytaniach
• R1:=ProjL(R2)
• L - jest listą atrybutów z relacji R2
• relacja R1 powstaje przez przejście po wszystkich krotkach
relacji R2 i wybór wszystkich atrybutów będących na liście L (z
zachowaniem kolejności)
• Jeżeli wystepują duplikaty krotek są one usuwane.
Film:
R1:=Projtytuł, czas(Film)
Tytuł
Żurek
Kingsajz
Seksmisja
Rok
2003
1987
1984
Czas
71
95
117
Tytuł
Żurek
Kingsajz
Seksmisja
Rodzaj
Kolor
Kolor
Kolor
Czas
71
95
117
9
10
Rzutowanie
Selekcja
• Odpowiednik SQL:
• R1 := SELECTC (R2)
– C jest warunkiem, który odnosi się do atrybutów relacji R
– R1 składa się z tych wszystkich krotek relacji R2, które spełniają
warunek C.
select empno, ename
from emp;
Film:
Tytuł
Żurek
Kingsajz
Seksmisja
Rok
2003
1987
1984
Czas
71
95
117
Rodzaj
Kolor
Kolor
Kolor
R1:=SELECTCZAS>90(Film)
Tytuł
Kingsajz
Seksmisja
11
Rok
1987
1984
Czas
95
117
Rodzaj
Kolor
Kolor
12
Selekcja
Iloczyn kartezjański
• Odpowiednik SQL
• R3 := R1 * R2
– każda krotka k1 relacji R1 jest łączona z każdą krotką k2 relacji R2
– złączenie t1t2 jest krotką relacji R3
– schemat relacji R3 składa się z atrybutów relacji R1 i następnie
atrybutów relacji R2
– w przypadku gdy atrybuty mają takie same nazwy “A” w relacjach
R1 i R2 należy używać: R1.A i R2.A
select * from emp
where job =‘MANAGER’;
13
14
Przykład R3:=R1*R2
R1(
R2(
A,
1
3
B)
2
4
B,
5
7
9
C)
6
8
10
R3(
A,
1
1
1
3
3
3
R1.B,
2
2
2
4
4
4
Iloczyn kartezjański
R2.B,
5
7
9
5
7
9
• Odpowiednik SQL: Policzyć jaki procent pracowników pracuje w
poszczególnych działach firmy.Podać nazwę działu i procent
pracowników.
C )
6
8
10
6
8
10
•
SQL> select A.dname, (A.x/B.y)*100 procent from
(select dname, count(empno) x from emp, dept where emp.deptno (+) =
dept.deptno group by dname, dept.deptno) A, (select count(*) y from emp) B;
DNAME
-------------- ---------ACCOUNTING
RESEARCH
SALES
OPERATIONS
15
PROCENT
21,4285714
35,7142857
42,8571429
0
16
Złączenie naturalne
Złączenie naturalne
• R3 := R1 JOIN R2
• Złączenie relacji przez połączenie par krotek, które w jakiś
sposób sobie odpowiadają:
• Odpowiednik SQL: Wypisać informacje o pracownikach łącznie z
nazwami ich departamentów.
– połączenie w pary tych krotek, które mają takie same wartości
pewnych atrybutów o tych samych nazwach
– krotka złączenia zawiera tylko jedną kopię powtarzających się
wartości
R1
select * from emp, dept
where emp.deptno=dept.deptno;
(lub od wersji Oracle 9i)
select *
from emp NATURAL JOIN dept;
select *
from emp JOIN dept USING (deptno);
R2
r1
r2
Krotka złączenia (r3)
17
18
Złączenie teta
Przykład
• R3:=R1 JOINC R2
• Relacja R3 jest utworzona w następujący sposób:
• Wypisz nazwiska wszystkich pracowników i nazwiska ich
kierowników.
– utworzyć iloczyn kartezjański relacji R1 i R2
– z iloczynu kartezjańskiego wybrać tylko te krotki, dla których
warunek C jest spełniony
Select prac.ename, kier.ename as mgr
from emp prac, emp kier
where prac.mgr=kier.empno;
• Odpowiednik SQL:
• R3:=emp JOINsal between losal and hisal salgrade
lub (od wersji Oracle 9i)
• select * from emp, salgrade
Select prac.ename, kier.ename as mgr
from emp prac JOIN emp kier ON prac.mgr=kier.empno;
where emp.sal between losal and hisal;
19
20
Przemianowanie
Tworzenie złożonych wyrażeń
• Przemianowanie określa nowy schemat relacji : nowe nazwy dla
atrybutów relacji
• R1 := RENAMER1(A1,…,An)(R2) - tworzy relację R1 z atrybutami
A1,…,An i tymi samymi krotkami jak w relacji R2.
• Wersja uproszczona zapisu: R1(A1,…,An) := R2.
• Tworzenie dowolnie złożonych wyrażeń, w których ustalanie
kolejności wykonywania poszczególnych operacji jest określane
poprzez wykorzystanie nawiasów i znajmość priorytetów operacji
• 3 notacje:
– sekwencje odpowiednich przypisań
– wyrażenia z wieloma operatorami
– drzewa wyrażeń
• Odpowiednik SQL: R1(numer_d nazwa_d, miejsce):=dept
select deptno as numer_d, dname as nazwa_d, loc as miejsce
from dept;
21
22
Sekwencje operacji
Wyrażenia z jednym przypisaniem
• Tworzenie tymczasowych relacji
• Przykład: złączenie teta R3 := R1 JOINC R2 może być zapisane
jako: R3 := SELECTC (R1 * R2)
• Przykład:
• R3 := R1 JOINC R2 może być zapisane jako:
• Priorytety operatorów relacyjnych:
–
–
–
–
R4 := R1 * R2
R3 := SELECTC (R4)
23
[SELECT, PROJECT, RENAME] (najwyższy).
[PRODUCT, JOIN].
INTERSECTION.
[UNION, --]
24
Drzewa wyrażeń
Podzapytania zwracające wiele wierszy
• W drzewie wyróżniamy liście (węzły końcowe) oraz węzły
wewnętrzne.
• Znaleźć pracowników o pensjach z listy najniższych zarobków
osiąganych w departamentach.
•
– Liście są operandami - nazwy relacji
– Węzły wewnętrzne - operatory, które działają na potomkach danego
węzła
SQL> select nazwisko, pensja, nr_departamentu from pracownik
where pensja in (select min(pensja) from pracownik group by nr_departamentu);
nazwisko
pensja nr_departamentu
---------- ---------- ---------SMITH
800
20
JAMES
950
30
MILLER
1300
10
• W jaki sposób można uzyskać informacje o pracownikach
zarabiających najmniej w ich departamentach? (Metoda 1)
•
SQL> select nazwisko, pensja, nr_departamentu from pracownik
where (pensja,nr_departamentu) in (select min(pensja), nr_departamentu from pracownik
group by nr_departamentu);
nazwisko
pensja nr_departamentu
---------- ---------- ---------SMITH
800
20
JAMES
950
30
MILLER
1300
10
25
26
Uwagi
Podzapytania skorelowane
• W jaki sposób można uzyskać informacje o pracownikach
zarabiających najmniej w ich departamentach? (Metoda 2)
• WHERE (kolumna1, kolumna 2...) = (SELECT kol1, kol2...)
•
• kolumny w bloku zewnętrznym powinny być ujęte w nawiasy i
oddzielone przecinkami
• powinna być zgodność co do liczby i typu kolumn wybieranych w
bloku wewnętrznym i kolumn bloku zewnętrznego
porównywanych z nimi
27
SQL> select nazwisko, pensja, nr_departamentu from pracownik e
where pensja = (select min(pensja) from pracownik where
e.nr_departamentu=pracownik.nr_departamentu group by nr_departamentu);
nazwisko
pensja nr_departamentu
---------- ---------- ---------SMITH
800
20
JAMES
950
30
MILLER
1300
10
28
Podzapytania skorelowane
uwagi
Podzapytania w klauzuli HAVING
• Każdy wiersz proponowany przez zapytanie główne przechodzi
„próbę” warunku wyrażonego za pomocą zapytania
skorelowanego, w którym występuje odwołanie do wartości
kolumn tego wiersza.
• Wybrać te departamenty, których średnie zarobki przekraczają
średni zarobek departamentu 30.
Select nr_departamentu, avg(pensja)
from pracownik
group by nr_departamentu
having avg(pensja) >(select avg(pensja) from pracownik where
nr_departamentu=30);
• Wykonanie SELECT z podzapytaniem skorelowanym:
– pobranie wiersza przez zewnętrzne zapytanie
– wykonanie wewnętrznego zapytania na podstawie wartości z
pobranego w pkt 1. Wiersza
– zaakceptowanie bądź odrzucenie wiersza na podstawie wyniku
zapytania z pkt 2.
– Powtórzenie akcji opisanych wyżej, aż do wyczerpania wszystkich
wierszy proponowanych przez zapytanie zewnętrzne.
29
• Znaleźć stanowisko pracy, na którym są najwyższe średnie
zarobki.
30
Select stanowisko, avg(pensja)
from pracownik
group by stanowisko
having avg(pensja) =(select max(avg(pensja)) from pracownik group
by stanowisko);

Podobne dokumenty