Plan wykładu Bazy danych Podstawy relacyjnego modelu danych Dr inż. Paweł Kasprowski pawel@kasprowski.pl Relacyjne bazy danych Język SQL Zapytania SQL (polecenie select) Bezpieczeństwo danych Integralność danych Współbieżność dostępu do danych Projektowanie schematu bazy danych (ERD) Literatura Sposób przechowywania danych Jeffrey D. Ullman, J. Widom Podstawowy wykład z systemów baz danych WNT 2001 Ramez Elmasri, Shamkant B. Navathe Wprowadzenie do systemów baz danych Helion 2004 Marcin Szeliga ABC języka SQL Helion 2002 Plik zawiera rekordy (dane pracowników) Rekord składa się z pól (pracownik Kowalski) Pole zawiera pojedynczą wartość (nazwisko, imie, data urodzenia) Pola mogą być różnych typów: tekstowe numeryczne daty i czasu Nomenklatura Przykład Plik > tablica Rekord > wiersz Pole > kolumna nazwisko imie adres dataur pensja
Dodanie nazwy zespołu Przykład nazwisko imie adres dataur pensja nazwa nazwisko imie adres dataur pensja nazwa Problemy: redundancja danych co jeśli chcemy przechować więcej informacji o zespołach? Rozwiązanie drugi rekord Jak zrealizować połączenie nazwisko imie adres dataur pensja Jeden zakład łączy się z wieloma pracownikami Połączenie jeden do wielu Zespoły nazwa budynek telefon kierownik Z P P P Z P P P Rozszerzenie przykładu pracują nad projektami Tworzy to hierarchiczny model danych Połączenie pracownik-projektprojekt Problem: nad projektem pracować może wielu pracowników Połączenie wiele do wielu Z Z D D P P P P P P P P P P P P P P P P P P P P
Dwa zapytania Model sieciowy Nad którym projektem pracują pracownicy zespołu OPROGRAMOWANIE którego zespołu pracują nad projektem EDYTOR TEKSTU Problem: niesymetryczność zapytań połączenia wiele do jeden są powolne Więcej połączeń Większe skomplikowanie! D D P P P P P P P P P P Model relacyjny Przykład 1971 E.F. Codd laboratoria IBM Wszystko jest danymi typami prostymi Nie ma specjalnych połączeń Wiersze tabel (relacji) nie są numerowane Połączenia wynikają z podobnych wartości atrybutów w różnych tabelach nazwisko imie adres dataur pensja idz Zespoły idz nazwa budynek telefon kierownik Przykład Rozszerzenie przykładu nazwisko imie adres dataur pensja idz Zespoły idz nazwa budynek telefon kierownik Tablica Zespoły Tablica Pracownicy Pracownicy realizują projekty: Tablica Projekty r nazwa datarozp datakon kierownik
Rodzaje związków Modelowanie związków N-M jeden do jeden Pracownicy Komputery jeden do wielu (1-N) Zespoły Pracownicy wiele do wielu (N-M) Pracownicy - Projekty Pracownicy nazw dataur Udział r Projekty r nazwa kierownik Dodatkowa tablica łącząca Pełna baza danych Dwa zapytania model relacyjny Zespoły idz nazwa kierownik Pracownicy nazw dataur idz Wypłaty r kwota data Projekty r nazwa kierownik Nad którym projektem pracują pracownicy zespołu OPROGRAMOWANIE którego zespołu pracują nad projektem EDYTOR TEKSTU Tym razem: symetryczność zapytań Relacyjny model danych Nomenklatura Iloczyn kartezjański A B = : {( ab) a A b B} Relacja to podzbiór iloczynu kartezjańskiego δ ( AB) = {( ab) : a A b B aδb} Trzy różne podejścia relacyjne logiczne fizyczne relation tablica plik tuple wiersz rekord atrybut kolumna pole Każde jest równie dobre
Algebra relacji Klucz relacji Terminologia A 1, A 2 atrybuty R, S schemat relacji, np. {A,B,C} r(r) relacja o schemacie R t x [A 1 ] wartość artybutu A 1 w krotce t x Zbiór atrybutów, których wartość jest unikalna dla każdej krotki Jest to podzbiór R K R taki, że dla każdej pary krotek z r t i t j r wartości klucza są różne t [ K ] t [ K ] i j Trzy podstawowe operacje Selekcja Selekcja wybór wierszy Projekcja wybór kolumn Złączenie naturalne łączenie relacji Matematycznie: σ ( r) = { t : t r w( t) TRUE} w = Podzbiór krotek relecji dla których spełniony jest warunek Projekcja Złączenie naturalne Matematycznie: π X ( r) = { u : u = t[ X ] t r} gdzie X jest podzbiorem R Wybór niektórych atrybutów ze wszystkich krotek relacji Dla dwóch relacji r(r) i s(s) ( R) s( S ) = r >< { u: t r w s t[ R S] = wr [ S] u [ R] = t u[ S] = w} Połącz dwie relacje według wspólnych dla nich atrybutów
Przykłady zapytań (1) Przykłady zapytań (2) Znajdź pracowników z pojedynczymi dochodami większymi niż 150 Znajdź pracowników z dochodami z projektu EDYTOR TEKSTU Π nazwisko (σ kwota>150 (pracownicy Χ wypłaty)) Π nazwisko (σ nazwa=edytor tekstu (pracownicy X wypłaty X projekty)) Przykłady zapytań (3) Język SQL Znajdź projekty w których brał udział pracownik Kowalski Π nazwa (σ nazwisko=kowalski (pracownicy X wypłaty X projekty)) 1972 - Codd, model relacyjny 1974 - baza SYSTEM/R i język SEQUEL 1979 - Relational Software Inc. tworzy system Oracle 1986 - Ingres RDBMS język QUEL 1989 - standard ANSI SQL (SQL-89) 1992 - ANSI SQL-92 podstawowy standard stał się także standardem ISO 1999 - ANSI SQL-99 (6 części) Język SQL Tworzenie tabeli Język deklaratywny składa się poleceń Elementy języka: DDL Data Definition Language CREATE, ALTER, DROP DML Data Manipulation Language INSERT, UPDATE, DELETE DQL Data Query Language SELECT DCL Data Control Language GRANT, REVOKE, DENY CREATE TABLE <nazwa> (<kolumna> <typ> [<ograniczenia>] [,...]) Typy kolumn: - tekstowe - numeryczne - datowe Pomimo istnienia standardu istnieją różnice w dostępnych typach dla różnych serwerów
Najważniejsze typy danych Typy tekstowe CHAR(n) VARCHAR(n) Typy numeryczne INT, SMALLINT, BIGINT DECIMAL(m, n) FLOAT, DOUBLE Typy datowe DATE, DATETIME, TIME, INTERVAL Inne typy BIT, BYTE, BOOLEAN SERIAL, AUTOINCREMENT BLOB, TEXT Rodzaje ograniczeń [ NOT ] NULL DEFAULT <wartość> UNIQUE CHECK (warunek) PRIMARY KEY FOREIGN KEY Tworzenie tabeli Modyfikacja tabeli CREATE TABLE prac ( int primary key, nazw varchar(20) not null, dataur date, pensja decimal(7,2) default 2000 ); ALTER TABLE <nazwa> <opis_zmiany> Przykłady: ALTER TABLE prac ADD COLUMN idz INT ALTER TABLE prac MODIFY COLUMN nazw varchar(50) Składnia może się różnić dla różnych serwerów! Usunięcie tabeli Praca z danymi DROP TABLE <nazwa_tabeli> Usuwa tabelę ze wszystkimi danymi INSERT wstawienie wiersza/wierszy INSERT INTO <tabela>[(<kolumny>)] VALUES (<wartości>) UPDATE modyfikacja wiersza/wierszy UPDATE <tabela> SET <kolumna>=<wartość>[, <kolumna>=<wartość>...] WHERE <warunek> DELETE usunięcie wiersza/wierszy DELETE FROM <tabela> WHERE <warunek>
Wstawianie wierszy Modyfikacja wierszy CREATE TABLE prac ( int unique, nazw varchar(20) not null, dataur date, pensja decimal(7,2) default 2000 ); INSERT INTO prac VALUES(1,'Kowalski','1-1-1980',3000); INSERT INTO prac(,nazw) VALUES(1,'Nowak'); -- Błąd: nie jest unikalny! INSERT INTO prac(,nazw) VALUES(2,'Nowak'); -- OK: pola dataur=null, pensja=2000 INSERT INTO prac(,pensja) VALUES(3,5000); -- Błąd: nazw nie może być null! INSERT INTO prac(,nazw) <polecenie SELECT> UPDATE prac SET nazw='nowak' WHERE nazw='kowalski' -- Uwaga! Zmieni nazwiska WSZYSTKICH Kowalskich! UPDATE prac SET nazw='nowak' WHERE =8 UPDATE prac SET nazw='nowak, dataur='1-1-1975' WHERE pensja > 2000 Warunek WHERE nie jest obowiązkowy można zmodyfikować wszystkie wiersze. Można także używać wyrażeń: UPDATE prac SET pensja=pensja+100 -- globalna podwyżka! bardzo użyteczne Usuwanie wierszy Wyszukiwanie danych Usuń najlepiej zarabiających: DELETE FROM prac WHERE pensja>3000 Usuń najstarszych: DELETE FROM prac WHERE dataur<'1950' Usuń starych dobrze zarabiających: DELETE FROM prac WHERE dataur<'1950' AND pensja>3000 Warunek WHERE nie jest obowiązkowy DELETE FROM prac -- usuwa wszystkie rekordy z tablicy prac Najczęściej wykonywana operacja (wyrocznia!) Polecenie: SELECT Możliwości sporej rozbudowy tego polecenia Podstawowa składnia: SELECT <kolumny> FROM <tablice> WHERE <warunki> Przykłady SELECT Warunki Podaj nazwiska i pensje pracowników zakładu nr 5 SELECT nazw,pensja FROM prac WHERE idz=5 -- wynik: tablica w dwóch kolumnach Podaj nazwisko pracownika nr 8 SELECT nazw FROM prac WHERE =8 -- wynik: jeden wiersz, jedna kolumna Zamiast listy kolumn można podać *, WHERE jest nieobowiązkowe: SELECT * FROM prac -- wynik: zawartość całej tablicy prac Porównania: =,<>,<,>,>=,<= [NOT] BETWEEN a AND b [NOT] IN (<lista wartości>) [NOT] LIKE 'tekst' % - dowolny ciąg znaków _ - dowolny znak Warunki logiczne: AND, OR AND ma wyższy priorytet! Wyrażenia algebraiczne (pensja*2>1000)
Przykłady warunków Złączenia w select select * from prac where between 2 and 5 select * from prac where nazw in ('Wolski','Niemczyk') select * from prac where nazw like 'Kro%' select * from prac where nazw like 'Kowalsk_' select * from prac where pensja/1000>2 select * from prac where nazw='wolski' OR nazwisko='niemczyk' select * from prac where nazw like 'A%' and pensja=1000 or pensja=3000 Podaj nazwiska pracowników zespołu 'Oprogramowanie' Filtr na nazwę Zespoły idz nazwa kierownik Złączenie Pracownicy nazw dataur idz wypisanie nazwisk Złączenia w select Złączenia w select Podaj nazwiska pracowników zespołu 'Oprogramowanie' select nazw from prac join zesp on prac.idz = zesp.idz where nazwa= 'Oprogramowanie' Podaj nazwiska pracowników zespołu 'Oprogramowanie' warunek połączenia select nazw from prac p join zesp z on p.idz = z.idz where nazwa= 'Oprogramowanie' Jeśli nie ma warunku połączenia iloczyn kartezjański (każdy wiersz z każdym) Dziękuję za uwagę Do zobaczenia... materiały dostępne pod adresem: www.kasprowski.pl