Plan wykładu Technologie baz danych Wykład 6: Algebra relacji. SQL - cd Algebra relacji operacje teoriomnogościowe rzutowanie selekcja przemianowanie Małgorzata Krętowska Wydział Informatyki Politechnika Białostocka SQL Podzapytania skorelowane Podzapytania w klauzuli HAVING 2 Pojęcie algebry relacji Operacje w algebrze relacji Algebra relacji obejmuje metody tworzenia nowych, bardziej skomplikowanych relacji na podstawie innego zbioru relacji. Wyróżniamy tutaj: wyrażenie(operand) - relacja, przedstawiona w postaci nazwy relacji lub jej krotek operatory - różnego typu procedury, które pozwalają na uzyskanie nowych relacji Algebra relacji jest podstawowym przykładem języka zapytań. Działania algebry zbiorów: suma, przecięcie i różnica zastosowane do relacji Operacje zawężania relacji: selekcja eliminuje pewne wiersze a rzutowanie niektóre kolumny Operacje komponowania krotek pochodzących z różnych relacji, np. iloczyn kartezjański 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. Odpowiednik w SQL: where deptno=10 union where deptno=30; 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 where deptno=10 intersect where deptno=30; union all - nie powoduje eliminacji duplikatów 5 6 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. Odpowiednik w SQL: where deptno=10 minus where deptno=30; Order by w zapytaniach z operatorami zbiorowymi 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 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 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 Rzutowanie R1:=Proj L (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: Tytuł Rok Czas Rodzaj Żurek 2003 71 Kolor Kingsajz 1987 95 Kolor Seksmisja 1984 117 Kolor R1:=Proj tytuł, czas (Film) Tytuł Czas Żurek 71 Kingsajz 95 Seksmisja 117 9 10 Rzutowanie Selekcja Odpowiednik SQL: select empno, ename from emp; R1 := SELECT C (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. Film: Tytuł Rok Czas Rodzaj Żurek 2003 71 Kolor Kingsajz 1987 95 Kolor Seksmisja 1984 117 Kolor R1:=SELECT CZAS>90 (Film) Tytuł Rok Czas Rodzaj Kingsajz 1987 95 Kolor Seksmisja 1984 117 Kolor 11 12
Odpowiednik SQL select * from emp where job = MANAGER ; Selekcja Iloczyn kartezjański 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 13 14 Przykład R3:=R1*R2 Iloczyn kartezjański R1( A, B ) 1 2 3 4 R2( B, C ) 5 6 7 8 9 10 R3( A, R1.B, R2.B, C ) 1 2 5 6 1 2 7 8 1 2 9 10 3 4 5 6 3 4 7 8 3 4 9 10 Odpowiednik SQL: Policzyć jaki procent pracowników pracuje w poszczególnych działach firmy.podać nazwę działu i procent pracowników. 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 PROCENT -------------- ---------- ACCOUNTING 21,4285714 RESEARCH 35,7142857 SALES 42,8571429 OPERATIONS 0 15 16
Złączenie naturalne R3 := R1 JOIN R2 Złączenie relacji przez połączenie par krotek, które w jakiś sposób sobie odpowiadają: 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 r1 r2 R2 Złączenie naturalne Odpowiednik SQL: Wypisać informacje o pracownikach łącznie z nazwami ich departamentów. 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); Krotka złączenia (r3) 17 18 Złączenie teta R3:=R1 JOIN C R2 Relacja R3 jest utworzona w następujący sposób: utworzyć iloczyn kartezjański relacji R1 i R2 z iloczynu kartezjańskiego wybrać tylko te krotki, dla których warunek C jest spełniony Odpowiednik SQL: R3:=emp JOIN sal between losal and hisal salgrade select * from emp, salgrade where emp.sal between losal and hisal; Przykład Wypisz nazwiska wszystkich pracowników i nazwiska ich kierowników. Select prac.ename, kier.ename as mgr from emp prac, emp kier where prac.mgr=kier.empno; lub (od wersji Oracle 9i) Select prac.ename, kier.ename as mgr from emp prac JOIN emp kier ON prac.mgr=kier.empno; 19 20
Przemianowanie Tworzenie złożonych wyrażeń Przemianowanie określa nowy schemat relacji : nowe nazwy dla atrybutów relacji R1 := RENAME R1(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. Odpowiednik SQL: R1(numer_d nazwa_d, miejsce):=dept 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ń 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: R3 := R1 JOIN C R2 może być zapisane jako: R4 := R1 * R2 R3 := SELECT C (R4) Przykład: złączenie teta R3 := R1 JOIN C R2 może być zapisane jako: R3 := SELECT C (R1 * R2) Priorytety operatorów relacyjnych: [SELECT, PROJECT, RENAME] (najwyższy). [PRODUCT, JOIN]. INTERSECTION. [UNION, --] 23 24
Drzewa wyrażeń W drzewie wyróżniamy liście (węzły końcowe) oraz węzły wewnętrzne. Liście są operandami - nazwy relacji Węzły wewnętrzne - operatory, które działają na potomkach danego węzła 25 26 Podzapytania zwracające wiele wierszy Znaleźć pracowników o pensjach z listy najniższych zarobków osiąganych w departamentach. 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 Uwagi 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 Podzapytania skorelowane W jaki sposób można uzyskać informacje o pracownikach zarabiających najmniej w ich departamentach? (Metoda 2) 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 27 28
Podzapytania skorelowane uwagi Podzapytania w klauzuli HAVING 29 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. 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. 30 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); Znaleźć stanowisko pracy, na którym są najwyższe średnie zarobki. Select stanowisko, avg(pensja) from pracownik group by stanowisko having avg(pensja) =(select max(avg(pensja)) from pracownik group by stanowisko);