Bazy danych 02
Download
Report
Transcript Bazy danych 02
Bazy danych
02:
Relacyjny model
danych, języki zapytań
Krzysztof Stencel
Pojęcia pierwotne
A – zbiór nazw atrybutów
D – zbiór wartości atomowych (napisy, liczby,
daty, wartości logiczne)
E – zbiór typów atomowych (integer, float,
string, boolean, date)
T – zbiór nazw relacji
Typy atomowe w SQL (Oracle)
NUMBER, NUMBER(c), NUMBER(c,d)
INTEGER
CHAR(x)
VARCHAR2(x)
DATE (data + czas)
TIMESTAMP (DATE + setne sekundy)
BOOLEAN
Schemat relacji
kol : T → Pfin (A) (nazwie relacji
przyporządkowujemy
skończone zbiory nazw kolumn)
dom : T × A → E (nazwie relacji i nazwie atrybutu
przyporządkowujemy typ
elementarny)
Przykład schematu relacji
T = { Osoba }
kol(Osoba) = { PESEL, Imię, Nazwisko, Wiek}
dom(Osoba, PESEL)
dom(Osoba, Imię)
dom(Osoba, Nazwisko)
dom(Osoba, Wiek)
= CHAR(11)
= VARCHAR2(20)
= VARCHAR2(25)
= NUMBER(3,0)
Schemat relacyjnej bazy danych
SCHrel = T, kol, dom
T–
skończony zbiór nazw tabel
kol – przyporządkowanie tabelom nazw kolumn
dom – przyporządkowanie kolumnom typów
(dziedzin)
Krotka relacji
Jeśli R ∈ T, to krotka t o schemacie R jest funkcją
przypisującą wartości nazwom kolumn:
t : kol(R) → D
dla A ∈ kol(R), t(A) ∈ Ddom(R,A)
Przykład krotki
kol(Osoba) = { PESEL, Imię, Nazwisko, Wiek }
t(PESEL)
t(Imię)
t(Nazwisko)
t(Wiek)
= ‘91081256453’
= ‘Alfred’
= ‘Miśkiewicz’
= 42
t jest krotką o schemacie Osoba.
Egzemplarz relacji i egzemplarz
bazy danych
Jeśli R ∈ T, to relacja o nazwie R jest
skończonym zbiorem krotek o schemacie R.
Egzemplarz relacyjnej bazy danych, to
przyporządkowanie egzemplarza relacji każdej
nazwie relacji zdefiniowanej w schemacie.
Relacja jako tabela
PESEL
Imię
Nazwisko
Wiek
91081256453
Alfred
Miśkiewicz
42
99060134534
Julia
Miśkiewicz
10
05222733453
Klaudia
Miśkiewicz
8
Relacja jako relacja
{
‘91081256453’, ‘Alfred’, ‘Miśkiewicz’, 42 ,
‘99060134534’, ‘Julia’,
‘Miśkiewicz’, 10 ,
‘05222733453’, ‘Klaudia’, ‘Miśkiewicz’, 8
}
Języki zapytań
Praktyczne: SQL, XQuery
Teoretyczne: algebra relacji (ALG), rachunek
pierwszego rzędu (FOL)
Eksperymentalne: OQL, Lorel, UnQL, SBQL…
Zajmiemy się pierwszymi trzema
Systematyczny kurs SQL na labach
SQL = Structured Query Language
Standard przemysłowy, choć nie zapewnia
przenośności.
Trzy warstwy: podstawowa (SQL-87),
pośrednia (SQL-92) i pełna (SQL-99).
Większość implementacji zgodna z SQL na
poziomie podstawowym.
SQL
= DML (Data Manipulation Language)
+ DDL (Data Definition Language)
+ DCL (Data Control Language)
+ SQL/CLI (API)
+ SQL/MM (multi-media)
+ SQL/Transaction
+ SQL/MED + SQL/JRT + SQL/OLB + ...
Rachunek pierwszego rzędu (FOL)
Zapytania mają postać:
{ xi1, xi2,…, xin : (x1, x2 ,…, xm) }
to formuła pierwszego rzędu o zmiennych
wolnych x1, x2,…, xm
Szukamy wszystkich wartościowań zmiennych x1,
x2,…, xm spełniających i dla każdego takiego
wartościowania generujemy krotkę xi1, xi2,…, xin
Algebra relacji (ALG)
Nośnik: wszystkie relacje dla zadanego zbioru
atrybutów i dziedzin
Operacje:
Selekcja
Suma
Rzut
Różnica
Zmiana nazw
Przecięcie
Złączenie
⋈
Produkt
Selekcja (wybór wierszy)
– formuła z nazwami kolumn jako zmiennymi
(r) = { t r : (t) }
kol((r)) = kol(r)
{ x1, x2,…, xm : (x1, x2,…, xm) r(x1, x2,…, xm) }
SELECT * FROM r WHERE ;
Rzut (wybór kolumn)
X kol(r) – pewien podzbiór kolumn
X(r) = { t↾X : t r }
kol(X(r)) = X
{ xi1, xi2,…, xin : r(x1, x2,…, xm) }
SELECT DISTINCT X FROM r;
Zmiana nazw (kolumn)
p : kol(r) A – funkcja różnowartościowa
p(r) = { u : tr akol(r) u(p(a))= t(a) }
kol(p(r)) = { p(a) : a kol(r) }
// obraz p
{ xp(1), xp(2),…, xp(m) : r(x1, x2,…, xm) }
SELECT a1 AS p(a1),…, am AS p(am) FROM r;
Suma, różnica, przecięcie
kol(r) = kol(s). Wówczas kol(rs)=kol(r)=kol(s).
r s = { t : tr ts } r s = { t : tr ts }
r s = { t : tr ts }
{ x1, x2,…, xm : r(x1, x2,…, xm) s(x1, x2,…, xm)}
SELECT * FROM r
UNION
EXCEPT INTERSECT
SELECT * FROM s;
Produkt kartezjański
r s = { t : t↾kol(r) r t↾kol(s) s }
kol(r s) = kol(r) ⊎ kol(s)
// suma rozłączna
{ x1,…, xm ,y1,…, yk : r(x1,…, xm) s(y1,…, yk) }
SELECT * FROM r,s;
SELECT * FROM r CROSS JOIN s;
// SQL87
// SQL92
Złączenie naturalne
r ⋈ s = { t : t↾kol(r) r t↾kol(s) s }
kol(r ⋈ s) = kol(r) kol(s)
// suma zwykła
{ x1,…, xm ,z1,…, zi,y1,…, yk : r(x1,…, xm, z1,…, zi)
s(y1,…, yk, z1,…, zi) }
Zakładamy, że kol(r) kol(s) zawiera i kolumn.
Złączenie naturalne (SQL)
SQL87:
SELECT x1,…, xm ,z1,…, zi,y1,…, yk
FROM r,s
WHERE r.z1 = s.z1 AND … AND r.zi = s.zi
SQL92:
SELECT * FROM r NATURAL JOIN s;
SELECT * FROM r JOIN s ON
(r.z1 = s.z1 AND … AND r.zi = s.zi);
SELECT * FROM r NATURAL JOIN s
USING (z1,…,zi);
Złączenie
Złożenie produktu kartezjańskiego z selekcją
r ⋈ s = (r s)
SELECT * FROM r,s WHERE ;
// SQL87
SELECT * FROM r JOIN s ON ;
// SQL92
SELECT * FROM r INNER JOIN s ON ; // SQL92
Domknięcie
ALG – tak, każda operacja daje relację
skończoną
FOL – nie, wynik może być nieskończony:
{ x,y : r(x) s(y) }
SQL – tak, ale uwaga na wielozbiory i
DISTINCT.
Niezależność dziedzinowa
i bezpieczeństwo FOL
Dziedzina aktywna = stałe + wartości z relacji
Zapytanie jest niezależne dziedzinowo (n. dz.,
domain independent), gdy dodawanie do
dziedziny elementów nie zmienia jego wyniku
[ Wynik zależy tylko od dziedziny aktywnej ]
Zapytanie jest bezpieczne (safe), gdy spełnia
pewne warunki składniowe (będą dalej)
Nie znamy właściwości zapytań n. dz.
Umiemy sprowadzić każde zapytanie n. dz. do
bezpiecznego
Niezależność dziedzinowa
a spełnialność
Problem decyzyjny, czy formuła I rzędu jest spełnialna,
jest nierozstrzygalny
Jeśli umielibyśmy decydować, czy formuła jest
niezależna dziedzinowo, to też umielibyśmy
decydować, czy formuła I rzędu jest spełnialna
(r(x) s(y))
jest bezpieczna wtedy i tylko wtedy, gdy jest
niespełnialna
Nie może więc istnieć skończony algorytm decydujący,
czy formuła jest niezależna dziedzinowo
Bezpieczny FOL
Zmienne: nieograniczone i ograniczone (mające wartości
z dziedziny aktywnej)
Definicja rekurencyjna ze względu na budowę:
–
–
–
–
–
r(x1, x2,…, xn ) wszystkie ograniczone
x = a, x jest ograniczona (a to stała lub zmienna ograniczona)
¬ wszystkie nieograniczone
1 2 ograniczone są te, które są ograniczone w 1 lub w 2
1 2 ograniczone są te, które są ograniczone w 1 i w 2
Wszystkie zmienne w formule muszą być ograniczone
żeby była bezpieczna
Bezpieczeństwo a niezależność
dziedzinowa
Niech będzie niezależna dziedzinowo
Każdą zmienną można więc bez zmiany
semantyki ograniczyć do dziedziny aktywnej.
Dodajemy więc czynnik ograniczający dla
każdej zmiennej x (a1, a2,…, an to stałe; r1,
r2,…, rm to symbole relacyjne):
(x=a1 x=a2 … x=an
y1, y2,…, yk (r1(y1, y2,…, yk ) x= y1)
y1, y2,…, yk (r1(y1, y2,…, yk ) x= y2)
… [ dla wszystkich relacji i argumentów ]
Prawie równe moce
(prawie robi różnicę)
sFOL = bezpieczne zapytania FOL
nFOL = niezależne dziedzinowo zapytania FOL
sFOL = nFOL = ALG
ALG = SELECT-FROM-WHERE
–
–
bo nie cały SQL!
gdy wszystko otoczyć SELECT DISTINCT * FROM
FOL prawie = ALG (czyli FOL ALG)
–
Bo zapytania zależne dziedzinowo