Plan wykáadu Bazy danych Wykáad 6: Postaci normalne. SQL - zapytania záo*one. Maágorzata Krtowska Katedra Oprogramowania e-mail: mmac@ii.pb.bialystok.pl Zale*noci wielowartociowe Czwarta postaü normalna Dekompozycja do 4NF SQL podzapytania podzapytania skorelowane operator EXISTS Bazy danych 2 Powtórzenie BCNF i 3NF Nowa forma redundancji Relacja R jest w postaci normalnej BCNF wtedy i tylko wtedy, gdy dla ka*dej nietrywialnej zale*noci A 1, A 2,..., A n B, zbiór {A 1, A 2,..., A n } jest nadkluczem R Mówimy, *e relacja jest w trzeciej postaci normalnej (3NF) wtedy i tylko wtedy, gdy jest speániony nastpujcy warunek: jeli A 1, A 2,..., A n B jest zale*noci nietrywaln, to albo {A 1, A 2,..., A n } jest nadkluczem albo B jest elementem pewnego klucza. Mo*e si okazaü, *e schemat relacji ma postaü BCNF, ale wystpuje w nim redundancja Najpowszechniejszym *ródáem redundancji s tzw zale*noci wielowartociowe (ZW), które wyra*aj zale*noü pomidzy krotkami istniejcej relacji, która to relacja stara si reprezentowaü wicej ni* jeden zwizek wiele do wielu. W takich sytuacjach niektóre atrybuty s od siebie niezale*ne i ich wartoci musz powtórzyü si w relacji we wszystkich mo*liwych kombinacjach. Bazy danych 3 Bazy danych 4
Przykáad Relacja: Jzyki (nazwisko, jzyk_programowania, jzyk_obcy) Czy znajomoü jzyka programowania jest zale*na od znajomoci jzyka obcego? W jaki sposób mo*na przedstawiü to w relacji? Wyra*enie zwizku wystpujcego w tej relacji prowadzi do umieszczenia w niej wszystkich kombinacji jzyka_programowania i jzyka_obcego dla poszczególnych osób. Zale*noci wielowartociowe definicja Zale*noü wielowartociowa A 1 A 2...A n ->->B 1 B 2...B m zachodzi w relacji R wówczas, gdy wybierajc z relacji R te krotki, które s zgodne dla atrybutów typu A, zbiór wartoci atrybutów typu B nie zale*y od *adnych wartoci tych atrybutów z R, których nie ma ani w zbiorze A, ani w B. Dla ka*dej pary krotek t i u z relacji R, które maj takie same wartoci atrybutów typu A, mo*na znale(ü w R tak krotk v, której skáadowe maj wartoci równe: wartociom atrybutów typu A w krotkach t i u wartociom atrybutów typu B krotki t wartociom tych skáadowych krotki u, które nie s ani typu A, ani typu B. Bazy danych 5 Bazy danych 6 Zale*noci wielowartociowe A->->B A B pozostaáe t u v Wnioskowanie z zale*noci wielowartociowych Reguáa zale*noci trywialnych jeli w pewnej relacji zachodzi zale*noü A 1 A 2...A n ->->B 1 B 2...B m to wówczas, gdy C 1 C 2...C k s wszystkimi atrybutami B oraz czü z nich jest typu A, zachodzi równie* A 1 A 2...A n ->-> C 1 C 2...C k Reguáa przechodnioci jeli zachodz zale*noci A 1 A 2...A n ->->B 1 B 2...B m i B 1 B 2...B m ->-> C 1 C 2...C k to zachodzi równie* zale*noü A 1 A 2...A n ->-> C 1 C 2...C k Zale*noci wielowartociowe nie speániaj reguáy podziaáu i áczenia. Bazy danych 7 Bazy danych 8
Przykáad cd Nazwisko Ulica Miasto Tytuá Rok Jerzy Stuhr Lipowa 14 Kraków Kingsajz 1987 Jerzy Stuhr Mickiewicza 24 Warszawa Kingsajz 1987 Nazwisko Ulica Miasto Tytuá Rok Jerzy Stuhr Lipowa 14 Warszawa Kingsajz 1987 Jerzy Stuhr Mickiewicza 24 Kraków Kingsajz 1987 Wnioskowanie z zale*noci wielowartociowych cd Ka*da zale*noü funkcyjna jest zale*noci wielowartociow, czyli jeli A 1 A 2...A n ->B 1 B 2...B m to A 1 A 2...A n ->->B 1 B 2...B m Reguáa dopeánienia jeli A 1 A 2...A n ->->B 1 B 2...B m zachodzi dla relacji R, to w R zachodzi równie* A 1 A 2...A n ->-> C 1 C 2...C k, gdzie atrybuty typu C s wszystkimi tymi atrybutami R, które nie s ani typu A, ani typu B. Przykáad: Relacja Aktorzy (nazwisko, ulica, miasto, tytuá, rok) Zale*noci wielofunkcyjne nazwisko->-> ulica miasto, z reguáy dopeánienia mamy te* zale*noü nazwisko ->-> tytuá rok, która jest równie* speániona Bazy danych 9 Bazy danych 10 Czwarta postaü normalna Zale*noü wielowartociow w relacji R: A 1 A 2...A n ->->B 1 B 2...B m okrelamy jako nietrywialn, jeli: )aden atrybut typu B nie jest typu A Ka*dy atrybut R jest albo typu A, albo typu B. Relacja R jest w czwartej postaci normalnej (4NF), wtedy i tylko wtedy, gdy: A 1 A 2...A n ->->B 1 B 2...B m jest nietrywialn zale*noci wielowartociow; {A 1 A 2...A n } jest nadkluczem w R. Dekompozycja do czwartej postaci normalnej Znajdujemy zale*noü, która nie speánia 4NF np. A 1 A 2...A n ->->B 1 B 2...B m, gdzie {A 1 A 2...A n } nie jest nadkluczem (mo*e byü to zale*noü np. wyprowadzona z pewnej zale*noci funkcyjnej). Wówczas schemat relacji R dzielimy na dwa schematy: pierwszy schemat zawiera wszystkie atrybuty typu A i typu B. Drugi schemat zawiera wszystkie atrybuty typu A oraz te wszystkie atrybuty z R, które nie s atrybutami ani typu A, ani typu B Bazy danych 11 Bazy danych 12
Zale*noci pomidzy postaciami normalnymi Relacje w 3PN Relacje w BCNF Relacje w 4NF Podzapytania Podzapytania skorelowane Opearator EXISTS SQL WáDFLZRü 3NF BCNF 4NF Eliminowanie redundancji przez zale*qrflixqnf\mqh WiNV]Rü Tak Tak Eliminowanie redundancji przez Nie Nie Tak zale*qrflzlhorzduwr FLRZH Zachowanie zale*qrfl Tak Mo*OLZH Mo*OLZH funkcyjnych Zachowanie zale*qrfl wielowartoflrz\fk Mo*OLZH Mo*OLZH Mo*OLZH Bazy danych 13 Bazy danych 14 Podzapytania Podzapytanie - polecenie SELECT zagnie*d*one w innym poleceniu SELECT. Umo*liwia konstruowanie zapytania odwoáujcego si do wartoci wybranych przez inne polecenie SELECT. Przykáad: SELECT kolumna1, kolumna2,... FROM tabela WHERE kolumna = (SELECT kolumna FROM tabela WHERE warunek) Podzapytania zwracajce jeden wiersz Wynikiem jest pojedynczy wiersz. Przykáad: Znale(ü pracowników z pensj równ minimalnemu zarobkowi w firmie. Co nale*y robiü po kolei? 1. Znajdujemy minimaln pensj: SQL> select min(sal) from emp; MIN(SAL) ---------- 800 2. Znajdujemy pracowników o pensji równej wartoci obliczonej w pierwszym kroku: select ename, job, sal from emp where sal =<wynik poprzedniego zapytania> Bazy danych 15 Bazy danych 16
Podzapytania zwracajce jeden wiersz Wstawiajc zapytanie 1 do 2, otrzymujemy: SQL> select ename, job, sal from emp where sal =(select min(sal) from emp); ENAME JOB SAL ---------- --------- ---------- SMITH CLERK 800 Przebieg wykonania zapytania: realizacja zapytania wewntrznego na podstawie wartoci zwróconej przez blok wewntrzny przetwarzany jest blok gáówny zapytania W przypadku zapyta zwracajcych jeden wiersz mog byü stosowane zwykáe operatory porównania: =, >, <=,... Podzapytania zwracajce jeden wiersz Znale(ü wszystkich pracowników zatrudnionych na tym samym stanowisku, co BLAKE. SQL> select ename, job from emp where job=(select job from emp where ename='blake'); ENAME JOB ---------- --------- JONES MANAGER BLAKE MANAGER CLARK MANAGER Czy jestemy pewni czy zapytanie zwróci jeden wiersz? Bazy danych 17 Bazy danych 18 Podzapytania zwracajce wiele wierszy Znale(ü pracowników o pensjach z listy najni*szych zarobków osiganych w departamentach. SQL> select ename, sal, deptno from emp where sal in (select min(sal) from emp group by deptno); ENAME SAL DEPTNO ---------- ---------- ---------- SMITH 800 20 JAMES 950 30 MILLER 1300 10 W jaki sposób mo*na uzyskaü informacje o pracownikach zarabiajcych najmniej w ich departamentach? (Metoda 1) SQL> select ename, sal, deptno from emp where (sal,deptno) in (select min(sal), deptno from emp group by deptno); ENAME SAL DEPTNO ---------- ---------- ---------- SMITH 800 20 JAMES 950 30 MILLER 1300 10 Bazy danych 19 Uwagi WHERE (kolumna1, kolumna 2...) = (SELECT kol1, kol2...) kolumny w bloku zewntrznym powinny byü ujte w nawiasy i oddzielone przecinkami powinna byü zgodnoü co do liczby i typu kolumn wybieranych w bloku wewntrznym i kolumn bloku zewntrznego porównywanych z nimi Bazy danych 20
Podzapytania skorelowane W jaki sposób mo*na uzyskaü informacje o pracownikach zarabiajcych najmniej w ich departamentach? (Metoda 2) SQL> select ename, sal, deptno from emp e where sal = (select min(sal) from emp where e.deptno=emp.deptno group by deptno); ENAME SAL DEPTNO ---------- ---------- ---------- SMITH 800 20 JAMES 950 30 MILLER 1300 10 Podzapytania skorelowane uwagi Ka*dy wiersz proponowany przez zapytanie gáówne przechodzi prób warunku wyra*onego za pomoc zapytania skorelowanego, w którym wystpuje odwoáanie do wartoci kolumn tego wiersza. Wykonanie SELECT z podzapytaniem skorelowanym: pobranie wiersza przez zewntrzne zapytanie wykonanie wewntrzngo zapytania na podstawie wartoci z pobranego w pkt 1. wiersza zaakceptowanie bd( odrzucenie wiersza na podstawie wyniku zapytania z pkt 2. Powtórzenie akcji opisanych wy*ej, a* do wyczerpania wszystkich wierszy proponowanych przez zapytanie zewntrzne. Bazy danych 21 Bazy danych 22 Sygnalizacja bádów Co si stanie, je*eli podzapytanie zwraca wicej ni* jeden wiersz a w warunku zostanie u*yty operator do porównywania jednego wyniku? SQL> select ename, sal, deptno from emp where sal = (select min(sal) from emp group by deptno); where sal = (select min(sal) from emp group by deptno) * BàD w linii 2: ORA-01427: jednowierszowe podzapytanie zwraca wicej ni* jeden wiersz Podobnie je*eli podzapytanie nie zwróci *adnego wiersza. Operatory ANY i ALL Opearatory ANY i ALL mo*na stosowaü w podzapytaniach zwracajcych wicej ni* jeden wiersz. Wykorzystuje si je w klauzulach WHERE I HAVING ácznie z operatorami porównywania (=;!=; <; >; <=; >=) Operator ANY powoduje akceptacj (speánienie warunku) po stwierdzeniu zgodnoci wyra*enia z którkolwiek z wartoci zwracanych przez podzapytanie Operator ALL sáu*y do porównania z wszystkimi wartociami zwracanymi przez podzapytanie Przed operatorami ANY i ALL mo*na stosowaü zaprzeczenie - NOT Bazy danych 23 Bazy danych 24
Podzapytania w klauzuli HAVING Podzapytania - wskazówki Wybraü te departamenty, których rednie zarobki przekraczaj redni zarobek departamentu 30. Select deptno, avg(sal) from emp group by deptno having avg(sal) >(select avg(sal) from emp where deptno=30); Znale(ü stanowisko pracy, na którym s najwy*sze rednie zarobki. Select job, avg(sal) from emp group by job having avg(sal) =(select max(avg(sal)) from emp group by job); Wewntrzne zapytanie musi byü ujte w nawiasy i musi wystpowaü po prawej stronie warunku W podzapytaniu nie wolno stosowaü klauzuli ORDER BY. Obowizuje zasada jednej klauzuli ORDER BY dla caáego polecenia SELECT. Jeli jest potrzebna umieszczamy j jako ostatni Kolumny wystepujce na licie wyboru wewntrznego zapytania musz wystpowaü w klejnoci zgodnej z kolejnoci kolumn ujtych w nawiasy warunku zapytania gáównego. Musi równie* wystpowaü zgodnoü co do liczby i typu kolumn wybieranych w bloku wewntrznym i kolumn bloku zewntrznego porównywanych z nimi. Bazy danych 25 Bazy danych 26 Podzapytania po FROM Przykáad cd Podzapytania mog wystpowaü po WHERE, HAVING i FROM: FROM tabela1, (podzapytanie1) alias1, (podzapytanie2) alias2... Policzyü jaki procent pracowników pracuje w poszczególnych dziaáach firmy.podaü nazw dziaáu i procent pracowników. Liczba pracowników w poszczególnych dziaách SQL> select dname, count(empno) x from emp, dept where emp.deptno (+) = dept.deptno group by dname, dept.deptno; DNAME X -------------- ---------- ACCOUNTING 3 RESEARCH 5 SALES 6 OPERATIONS 0 Bazy danych 27 Liczba wszystkich pracowników SQL> select count(*) y from emp; Y ---------- 14 Caáe zapytanie: 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 Bazy danych 28
Operator EXISTS W przypadku zapyta skorelowanych czasami nie interesuje nas wynik zapytania, ale jedynie czy wiersz o zadanych przez nas warunkach istnieje. Wówczas wykorzystujemy operator EXISTS. EXISTS (podzapytanie) - zwraca true je*eli podzapytanie zwróci przynajmniej jeden wiersz NOT EXISTS(podzapytanie) zwraca true je*eli podzapytanie nie zwróci *adnego wiersza Bazy danych 29