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