Bazy danych
Zagadnienia Podstawy relacyjnych baz danych SQL Języki manipulowania w relacjach Aspekty aktywne baz danych Aspekty systemowe baz danych Projektowanie baz danych Zależności funkcyjne i postacie normalne Transakcje bazodanowe Autoryzacja w bazach danych
Literatura J.D. Ullman, J.Widom, Podstawowy wykład z systemów baz danych, Wydawnictwo Naukowo-Techniczne, Warszawa, 2000. T. Pankowski, Podstawy baz danych, Wydawnictwo Naukowe PWN, Warszawa, 1992. L. Banachowski, SQL Język relacyjnych baz danych R. J. Muller, Bazy danych Język UML w modelowaniu danych Jeffrey D. Ullman - Principles of database systems, 1982
Bazy danych Informacje podstawowe
Czym jest baza danych? Zbiór danych istniejących przez długi czas, posiadać odpowiednią strukturę (schemat bazy danych), można na danych wykonywać pewne operacje, reprezentuje pewien fragment rzeczywistości, jest projektowana, tworzona i utrzymywana z punktu widzenia pewnych zastosowań. Zachowane są więzy integralności.
System zarządzania bazą danych Zbiór programów umożliwiających tworzenie i utrzymywanie bazy danych Cechy: Umożliwia dodanie nowej bazy danych i określenia jej schematu Umożliwia zadawanie zapytań Zapewnia możliwość przechowywania dużej ilości danych Jednoczesny dostęp do danych przez wielu użytkowników Umożliwia kontrolę dostępu do poszczególnych danych bazy
Architektura systemu zarządzania bazą danych Moduł zarządzania pamięcią składa się z modułu zarządzania plikami i modułu zarządzania buforami: modułu zarządzania plikami - przechowuje dane o miejscu zapisania plików na dysku i na polecenie modułu zarządzania buforami przesyła zawartość bloku danych lub bloków moduł zarządzania buforami przydziela strony pamięci operacyjnej do odpowiednich bloków Moduł zarządzania zapytaniami przetwarza zapytanie języka SQL na ciąg poleceń żądających dostarczenia określonych danych. Optymalizacja zapytania odpowiedni plan, itd. Indeksy Moduł zarządzania transakcjami
Algebra relacji i SQL
Struktury danych Relacyjna baza danych jest zbiorem relacji. Schemat relacji R(A1, A2,, An) składa się z nazwy relacji R oraz listy atrybutów A1, A2,, An. Każdy atrybut Ai schematu relacji R posiada dziedzinę oznaczoną jako dom(ai). Dziedzina definiuje zbiór wartości jakie dany atrybut może przyjmować. Z atrybutem związany jest więc typ danych.
Struktury danych (2) Relacją r o schemacie R(A1, A2,, An) oznaczoną r(r) nazywamy zbiór k krotek postaci: r = {t1,t2,, tk}. Pojedyncza krotka t jest uporządkowaną listą n wartości: t=< v1,v2,, vn > przy czym vi jest wartością należącą do dom(ai) lub wartością pustą (NULL). i-ta wartość krotki t odpowiadająca wartości atrybutu Ai będzie oznaczona przez t.ai.
Struktury danych (3) Relacja r(r) jest matematyczną relacją stopnia n zdefiniowaną na zbiorze domen: dom(a1), dom(a2),, dom(an) będącą podzbiorem iloczynu kartezjańskiego domen definiujących R: r(r) dom(a1) x dom(a2)x x dom(an)
Charakterystyka relacji Każdy atrybut relacji ma unikalną nazwę Porządek atrybutów w relacji nie jest istotny Porządek krotek w relacji nie jest istotny Wartości atrybutów są atomowe (elementarne) Relacja nie zawiera rekordów powtarzających się
Typy atrybutów Przykładowe typy atrybutów: Char(n) pole tekstowe o stałej długości (jeśli podamy mniej znaków, to pozostałe będą spacjami wypełnione) Varchar(n) pole tekstowe nie dłuższe niż n znaków ( nie ma spacji) Int, Integer liczby całkowite Numeric liczby stałopozycyjne np. Numeric(10,2), 2 miejsca po przecinku Float (8 bytes), Real(4 bytes) liczby zmiennopozycyjne BLOB pola przechowujące liczby binarne
SQL, Algebra relacji SQL (Structured Query Language) język zapytań dla relacyjnych baz danych; Język nieproceduralny użytkownik wyszczególnia operacje co ma być zrobione, a nie w jaki sposób. SQL posiada optymalizator, który wybiera optymalną ścieżkę wykonywania zapytania. SQL ma kilka dialektów. Są nieznaczne różnice pomiędzy różnymi systemami baz danych.
Udostępnienie relacji Udostępnienie relacji (tabeli) o nazwie R: Algebra relacji (AR): R SQL: Select * from R Przykład: select * from Pracownik
Suma Definicja: Operandy R, S tabele jednakowego typu U, wynik: tabela typu U Suma mnogościowa (union): R S = { t t R t S} Student Pracownik Wynik Przykład: select Imie, Nazwisko, NrIndeksu, Rok FROM Student union select Imie, Nazwisko, NrPrac, RokPracy FROM Pracownik
Przekrój Definicja: Operandy R, S tabele jednakowego typu U, wynik: tabela typu U Przekrój (intersect): R S = { t t R t S} Student Pracownik Wynik Przykład: select Imie, Nazwisko FROM Student intersect select Imie, Nazwisko FROM Pracownik
Różnica Definicja: Operandy R, S tabele jednakowego typu U, wynik: tabela typu U Różnica (except): R - S = { t t R t S} Student Pracownik Wynik Przykład: select Imie, Nazwisko FROM Student except select Imie, Nazwisko FROM Pracownik
Selekcja Wypisuje tylko takie krotki, które spełniają warunek. R1 := C (R2), C oznacza warunek Przykład: Sells Wynik AR: Tawerna := bar= Tawerna (Sells) SQL: SELECT * FROM Sells WHERE bar = Tawerna
Selekcja (2) SQL: SELECT * FROM Sells WHERE bar = Tawerna Operatory logiczne: =, <>, >=,<, <=, NOT, LIKE Działanie operatora LIKE: AR: T1 := bar like T% (Sells) SQL: SELECT * FROM Sells WHERE bar like T%
Definicja warunku Definicja warunku E: U zbiór atrybutów, V zbiór stałych (liczb, tekstów), A, A' U, c V, {=,!=, <, <=, >, >=, like,... } operator porównania, Warunkiem nad U nazywamy wyrażenie logiczne E : E ::= A c A A' (E ) not E E or E E and E Krotka r typu U spełnia warunek E, E (r ) = TRUE, jeśli wyrażenie powstałe z E przez podstawienie za każde wystąpienie atrybutu A wartości r.a jest prawdziwe.
Projekcja Wypisuje wszystkie krotki, ale ogranicza atrybuty do wyspecyfikowanej listy. R1 := L (R2), L oznacza listę atrybutów należącą do schematu R2. Przykład: Sells Wynik AR: Prices := beer,price(sells): SQL: SELECT beer,price FROM Sells
Projekcja - formalnie Krotka: r = [A:a, B:b, C:c] typu U={A,B,C} X = {A,C} U Projekcja r na zbiór X: X(r) = {A,C}[A:a, B:b, C:c] = [A:a, C:c] Definicja: Niech r będzie krotką typu U i niech X U. Krotkę t typu X nazywamy projekcją r na X, jeśli t i r mają jednakowe wartości na wszystkich atrybutach ze zbioru X, tzn: t = X(r) A( A X t.a = r.a). X operator projekcji, t.a wartość pola A dla krotki t.
Rozszerzona projekcja Rozszerzona projekcja umożliwiająca tworzenie nowych atrybutów za pomocą wyrażeń arytmetycznych oraz duplikowania istniejących. Przykład: Sells Wynik AR: Prices := Beer+Bar ->B, Bar, Bar (Sells) SQL: SELECT Bar + Beer as B, Bar, Bar FROM Sells
Iloczyn kartezjański R3 := R1 X R2 Łączy każdą krotkę relacji R1 z każdą krotką R2. Przykład: Sells Bar Wynik AR: Cartesian := Sells X Bar SQL: SELECT * FROM Sells, Bar T- SQL: SELECT * FROM Sells CROSS JOIN Bar
Iloczyn kartezjański - formalnie Iloczyn kartezjański krotek: [A:a, B:b]N M[A:a, C:c] = [N.A:a, N.B:b, M.A:a, M.C:c] Uwaga: W iloczynie kartezjańskim występują wszystkie kolumny z obydwu operandów. Prefiksowanie nazwami N i M jest potrzebne dla zapewnienia jednoznaczności nazw pól (kolumn). Gdy atrybuty w krotkach są różne, to prefiksowanie nie jest konieczne.
Złączenie warunkowe R3 := R1 C R2 Na iloczyn kartezjański R1 X R2 nakładany jest warunek C. Złączenie jest nazwane Theta Join. Przykład: Sells Bar Wynik AR: ThetaJoin := Sells Sells.Bar = Bar.Bar Bar SQL: SELECT * FROM Sells INNER JOIN Bar ON Bar.Bar = Sells.Bar
Złączenie naturalne R3 := R1 R2 Łączy relacje R1 i R2 po wspólnym atrybucie. Wspólny atrybut wypisuje tylko raz. Przykład: Sells Bar Wynik AR: Natural := Sells Bar SQL: SELECT * FROM Sells NATURAL JOIN Bar SQL: SELECT * FROM Sells, Bar WHERE Sells.Bar = Bar.Bar
Złączenie naturalne - formalnie Definicja: Niech r i s będą krotkami typów odpowiednio X i Y. Krotka t typu X Y jest złączeniem naturalnym r i s, t = r s, jeśli π X(t) = r i π Y(t) = s. Krotki naturalnie złączalne: [A:a, B:b, C:c, D:d] [A:a, B:b, D:d, E:e, F:f] = [A:a, B:b, C:c, D:d, E:e, F:f] Krotki niezłączalne: [A:a, B:b, C:c, D:d], [A:a, B:b, D:d, E:e, F:f]
Przemianowanie R1 := ρ R1(A1,,An)(R2) Tworzy relację R1 z przemianowanymi atrybutami relacji R2. Przykład: Bar Wynik AR: R:= ρ R(name, addr) (Bar) SQL: SELECT Bar as Name, Address as addr FROM Bar AS R
Schematy operatorów algebry relacji Suma, różnica, przekrój: schematy argumentów operacji są takie same jak schemat wyniku. Selekcja: schemat argumentu jest taki sam jak schemat wyniku. Projekcja: lista atrybutów projekcji mówi o schemacie wynikowym.
Schematy operatorów algebry relacji (2) Iloczyn kartezjański: schemat wynikowy składa się z atrybutów należących do obydwu relacji. Żeby odróżnić atrybuty o tej samej nazwie pochodzące z różnych relacji, należy podać nazwę relacji, np.. R.A Złączenie warunkowe: tak samo jak iloczyn kartezjański. Złączenie naturalne: suma atrybutów dwóch relacji. Przemianowanie: operator określa schemat.
Usuwanie duplikatów R1 := δ (R2). R1 składa się z jednej kopii każdej krotki, która w R2 występuje wiele razy. Przykład: AR: BarDist:= δ( Bar (Sells)) SQL: select distinct Bar FROM Sells
Sortowanie R1 := L (R2) R1 jest listą krotek z R2 posortowaną najpierw po pierwszym atrybucie z listy L, potem po drugim, itd.. Przykład: Sells Wynik AR: Ordered : = Price Sells SQL: select * FROM Sells ORDER BY Price
Agregacje Operacje agregacji nie są operacjami algebry relacji. Na podstawie wszystkich wartości atrybutów obliczają jedną wartość. Przykład: Sells SUM(Price) = 12,50 COUNT(Price) = 4 MAX(Price) = 3,50 AVG(Price) = 3,125 SQL: select avg(price) FROM Sells
Grupowanie R1 := L (R2), L jest listą atrybutów, które są: pojedynczymi atrybutami; AGG(A), gdzie AGG jest funkcją agregującą na atrybucie A; R1 := L (R2) grupuje R2 według wszystkich atrybutów grupujących w L, czyli formułuje jedną grupę dla każdej różnej listy wartości tych atrybutów dla każdej grupy oblicza wartość funkcji agregującej
Grupowanie (2) Przykład 1: Sells Wynik AR: Group := Bar, AVG(Price) -> AvgPrice (Sells) SQL: select Bar, AVG(Price) As AvgPrice FROM Sells GROUP BY Bar Przykład 2: Sells Wynik AR: Group := Bar,Beer, AVG(Price) -> AvgPrice (Sells) SQL: select Bar,Beer, AVG(Price) As AvgPrice FROM Sells GROUP BY Bar,Beer
Grupowanie (3) Wyniki grupowanie można ograniczyć selekcją Przykład: Sells Wynik AR: Group := AVG(Price)>3 Bar,Beer, AVG(Price) -> AvgPrice (Sells)) SQL: select Bar,Beer, AVG(Price) As AvgPrice FROM Sells GROUP BY Bar,Beer having AVG(Price)> 3
Łączenie zewnętrzne obie kolejne instrukcje zwracają wszystkie rekordy X i tylko te rekordy Y, w których <warunek> ma wartość True: SELECT * FROM X LEFT OUTER JOIN Y ON <warunek> SELECT * FROM Y RIGHT OUTER JOIN X ON <warunek>
Łączenie zewnętrzne (2) Pełne łączenie zewnętrzne zwraca wszystkie rekordy obu zestawów, łącząc ze sobą tylko te rekordy, w których warunek jest spełniony (daje wartość True). SQL Server umożliwia pełne łączenia zewnętrzne za pomocą warunku FULL OUTER JOIN: SELECT * FROM X FULL OUTER JOIN Y ON <warunek>
Złączenie zewnętrzne Przykład: SELECT * FROM Sells RIGHT OUTER JOIN Bar ON Bar.Bar = Sells.Bar SELECT * FROM Bar LEFT OUTER JOIN Sells ON Bar.Bar = Sells.Bar SELECT * FROM Bar FULL OUTER JOIN Sells ON Bar.Bar = Sells.Bar Sells Bar Wynik
Operatory mnogościowe (różnica) select Imie, Nazwisko FROM Student except select Imie, Nazwisko FROM Pracownik select s.imie, s.nazwisko from Student as s left outer join Pracownik as p on s.imie = p.imie and s.nazwisko = p.nazwisko where p.imie is null
Operatory mnogościowe (przekrój) select Imie, Nazwisko FROM Student intersect select Imie, Nazwisko FROM Pracownik select s.imie, s.nazwisko from Student as s left outer join Pracownik as p on s.imie = p.imie and s.nazwisko = p.nazwisko where p.imie is not null
Instrukcja SELECT SELECT <ListaPól> FROM <ListaZestawówRekordów> <RodzajŁączenia> JOIN <Warunek> WHERE <KryteriaWyboru> GROUP BY <ListaPólGrupujących> HAVING <KryteriaWyboru> ORDER BY <ListaPólPorządkujących>
Instrukcja WHERE select * FROM Pracownik WHERE Nazwisko < Imie select * FROM Pracownik WHERE Wydzial IN('PPT', 'IZ') select * FROM Pracownik WHERE Wydzial NOT IN('PPT', 'IZ') select * FROM Pracownik WHERE Wydzial IN ('PPT') OR Wydzial IN ('IZ') select * FROM Pracownik WHERE NrPrac BETWEEN 3300 AND 3600 select * FROM Pracownik WHERE NrPrac IS NULL
Podzapytania Q: Podaj wszystkich pracowników, którzy pracują na wydziale, który ma lokalizację we Wrocławiu. Pracownik Lokalizacja SELECT * FROM Pracownik WHERE Wydzial IN (SELECT Wydzial FROM Lokalizacja WHERE Lokalizacja = 'Wroclaw') Wynik
Podzapytania Q: Podaj wszystkie lokalizacje wydziału, na którym pracuje Zaorski. Pracownik Lokalizacja SELECT Lokalizacja FROM Lokalizacja WHERE Wydzial IN (SELECT Wydzial FROM Pracownik WHERE Nazwisko = 'Zaorski') Wynik
Podzapytania Q: Podaj pracowników, których zarobki są mniejsze niż średnia zarobków pracowników. Pracownik Lokalizacja SELECT * FROM Pracownik WHERE Zarobki < (SELECT AVG(Zarobki) FROM Pracownik ) Wynik
Podzapytania Podzapytania mogą być bardziej zagnieżdżone, tzn. w warunku może być następny warunek, itd. W podzapytaniu lewa strona predykatu wymaga zgodnego wyniku z podzapytaniem po prawej stronie. Przykład: Liczba > (podzapytanie zwracające pojedynczą liczbę) Napis = (podzapytanie zwracające pojedynczy napis) Nie może być: Liczba > (Lista liczb)
Podzapytania Składnia z użyciem IN: liczba IN (podzapytanie zwracające listę liczb) text IN (podzapytanie zwracające listę testów) Nie może być: Liczba > (Lista liczb) Może być: Liczba > ANY (Lista liczb) Liczba > ALL (Lista liczb)
Podzapytania Q: Podaj pracowników, których zarobki są większe lub równe niż zarobek przynajmniej jednego pracownika. Pracownik Lokalizacja SELECT * FROM Pracownik WHERE Zarobki > ANY(SELECT (Zarobki) FROM Pracownik ) Wynik
Podzapytania Q: Podaj pracowników, których zarobki są większe niż od zarobku wszystkich pracowników. Pracownik Lokalizacja SELECT * FROM Pracownik WHERE Zarobki >= ALL(SELECT (Zarobki) FROM Pracownik ) Wynik
Podzapytania W przypadku zapytania ze zwykłym podzapytaniem, podzapytanie wykonywane jest jako pierwsze, a wyniki tymczasowe są przechowywane w pamięci SZRBD. Przykład: WHERE Zarob < (SELECT AVG(ZAROB).) Wynik podzapytania jest sprawdzany z każdym wierszem tabeli.
Podzapytania skolerowane Q: Którzy ludzie zarabiają mniej niż wynosi średnia pensja na tym wydziale, na którym dany pracownik pracuje. Pracownik Lokalizacja SELECT * FROM Pracownik AS p WHERE Zarobki < (SELECT AVG(Zarobki) FROM Pracownik AS s WHERE p.wydzial = s.wydzial) Wynik
Podzapytania skolerowane Q: Podaj takie lokalizacje, dla których istnieją pracownicy w nich pracujący. Pracownik Lokalizacja SELECT * FROM Lokalizacja WHERE EXISTS (SELECT * FROM Pracownik WHERE Lokalizacja.Wydzial = Pracownik.Wydzial) Wynik Wyrażenie EXISTS(podzapytanie) jest prawdziwe tylko wtedy, kiedy podzapytanie zwróci co najmniej jeden wiersz
Podzapytania skolerowane Q: Podaj takie lokalizacje, dla których nie istnieją pracownicy w nich pracujący. Pracownik Lokalizacja SELECT * FROM Lokalizacja WHERE NOT EXISTS (SELECT * FROM Pracownik WHERE Lokalizacja.Wydzial = Pracownik.Wydzial) Wynik Wyrażenie NOT EXISTS(podzapytanie) jest prawdziwe tylko wtedy, kiedy podzapytanie nie zwróci żadnego wiersza.
Podzapytania skolerowane W przypadku zapytania ze zwykłym podzapytaniem, podzapytanie wykonywane jest jako pierwsze, a wyniki tymczasowe są przechowywane w pamięci SZRBD. W przypadku zapytań skolerowanych wartość z głównego zapytania jest przekazywana do podzapytania, aby mogło być ono wykonane.
Wstawianie wierszy Pracownik Wynik insert into Pracownik (Imie, Nazwisko, NrPrac, RokPracy, Wydzial, Zarobki) values ('Jadwiga', 'Mrozowska',23000, 8,'PPT', 1200)
Wstawianie wierszy Można opuścić jakiś atrybut: np. RokPracy, Wydział. Jeśli dla tego atrybutu jest zdefiniowana wartość domyślna, wówczas wpisywana jest wartość domyślna. Jeśli nie ma domyślnej wartości to wstawiany jest NULL o ile dla atrybutu można wstawić NULL. Pracownik Wynik insert into Pracownik (Imie, Nazwisko, NrPrac, RokPracy) values ('Jadwiga', 'Hajnicz',23000,4)
Wstawianie wierszy Można opuścić wszystkie atrybuty tabeli. Wtedy należy jednak podać wszystkie wartości. Pracownik Wynik insert into Pracownik values ('Jadwiga', 'Jazwa',23000, 8,'PPT', 1200)
Wstawianie wielu wierszy Można wstawić wiele wierszy do tabeli na podstawie danych z innej tabeli. Pracownik Wynik insert into Pracownik2 (Imie, Nazwisko, NrPrac, Wydzial) select Imie, Nazwisko, NrPrac, Wydzial from Pracownik
Usuwanie danych z tabeli Usuwanie wszystkich danych z tabeli delete from Pracownik2 Usuwanie niektórych krotek delete from Pracownik where Imie = 'Jadwiga' Pracownik Wynik
Usuwanie danych z tabeli Przy usuwaniu można korzystać z podzapytań. Q: Usuń wszystkich pracowników, którzy pracują na wydziale, który ma lokalizację we Wrocławiu delete FROM Pracownik2 WHERE Wydzial IN (SELECT Wydzial FROM Lokalizacja WHERE Lokalizacja = 'Wroclaw') Pracownik2 Wynik
Modyfikowanie wierszy Pracownik Wynik update Pracownik set Wydzial = 'IZ', NrPrac = 22000 WHERE Nazwisko = 'Zaorski'
Modyfikowanie wierszy Pracownik2 Pracownik UPDATE Pracownik2 SET Pracownik2.Wydzial = Pracownik.Wydzial FROM Pracownik2 INNER JOIN Pracownik ON Pracownik2.NrPrac = Pracownik.NrPrac Pracownik2
To tyle.