Relacyjne bazy danych

Transkrypt

Relacyjne bazy danych
Relacyjne bazy
danych
Tadeusz Pankowski
www.put.poznan.pl/~tadeusz.pankowski
1
2
Model danych
Baza danych
¾ Model danych:
• Aspekt strukturalny: Zbiór struktur danych, zbiór operacji na
tych strukturach, zbiór zależności między danymi.
• Aspekt semantyczny: Ustalenie znaczeń – znaczenie
(semantyka) struktur danych względem wiedzy o świecie
rzeczywistym, określenie semantyki (wartości) operacji.
• Aspekt pragmatyczny: Określenie zasad korzystania z
modelu danych w systemie bazy danych dla rozwiązywania
konkretnych problemów (reprezentacja stanu systemu
rzeczywistego, formułowanie zapytań, wykonywanie
transakcji, ...).
Baza danych:
• jest logicznie spójnym zbiorem danych posiadających określoną strukturę,
na których można wykonywać określone operacje (aspekt składniowy i
operacyjny);
• reprezentuje pewien fragment świata rzeczywistego zwanego dziedziną
przedmiotową (application domain); zmiany w dz.p. odzwierciedlane są w
bazie danych (aspekt semantyczny);
• jest projektowana, tworzona i utrzymywana z punktu widzenia
przydatności dla określonych zastosowań, którymi zainteresowana jest
określona grupa użytkowników (aspekt pragmatyczny).
Z bazą danych związane są:
• źródło, z którego wyprowadzane są dane (dz.p.);
• określony poziom interakcji ze zdarzeniami zachodzącymi w dz.p.;
• grupa użytkowników czynnie zainteresowana zawartością bazy danych.
3
4
Relacyjny model danych
Relacyjne (SQL-owe) bazy danych
¾ E.F. Codd, "A relational model of data for large shared
data banks", Communications of ACM 13 (3), 1970, ss.
377-387.
¾ Model danych (podstawa teoretyczna):
• struktury: dane proste (atomowe), krotki, tabele
(relacje);
• operacje: operacje algebry relacji, rachunki relacji,
operacje aktualizacji;
• zależności: zależności funkcyjne (klucze główne),
zależności referencyjne (klucze obce), ograniczenia na
wartości, ...
¾ Relacyjne bazy danych = SQL-owe bazy danych
• wykraczają istotnie poza teoretyczny model relacyjny (włączają
koncepcje obiektowości, XML, programowanie),
¾ SQL-owe bazy danych
• standard SQL-92
• standard SQL:1999, SQL:2003
¾ Najważniejsze relacyjne SZBD:
• Oracle 9i, 10g
• MS SQL Server 2000, 2005, 2008
• DB2, Sybase, Interbase, ...
¾ Inne systemy relacyjne
• dBASE, Clipper, Xbase (stare systemy powszechne w Polsce)
• Access (Microsoft)
• MySQL, PostgreSQL (oprogramowanie wolne).
5
Relacyjny model danych
6
Relacyjny model danych
Atrybut – symbol, nazwa
(np. Nazwisko, NrEwid, DataUr, Cena, ...),
U = {A1,...,An} – zbiór atrybutów.
Dziedzina atrybutu – Dom(A), zbiór dopuszczalnych wartości atrybutu A.
Wszystkie wartości są proste (atomowe).
Wyróżniona wartość pusta NULL ∈ Dom(A).
Krotka (wiersz, rekord) typu U
r = [A1:a1,...,An:an], ai ∈ Dom(Ai), [ ] – krotka pusta,
r = (a1,..., an) – zapis uproszczony, gdy ustalona jest kolejność atrybutów,
Tabela (relacja) R typu U – skończony zbiór (wielozbiór – mogą występować
duplikaty!) krotek typu U.
Formalnie:
Krotka jest funkcją z U do V=Dom(A1) ∪ ... ∪ Dom(An),
r : U → V, r (Ai) = r.Ai ∈ Dom(Ai)
7
8
Algebra relacji
Operacje na tabelach (relacjach)
Att – nieskończony i przeliczalny zbiór atrybutów,
Val – zbiór wartości
Algebrą relacji nazywamy następującą strukturę:
AlgRelAtt,Val = (Tab, {∪X, –X, πX, δXÆY, ´, σE}),
gdzie:
Dwie grupy operacji:
1. Operacje mnogościowe - wynikają z faktu, że tabela jest
zbiorem:
•
∪X – suma mnogościowa tabel typu X, X ⊂ Att (X jest skończony),
–X – różnica mnogościowa tabel typu X,
πX – projekcja tabeli na zbiór X,
δXÆY – przemianowanie tabeli poprzez zmianę nazw z X na
odpowiadające im nazwy z Y,
´
– złączenie tabel o dowolnych typach,
σE – selekcja z tabeli według warunku E.
suma, różnica (+ przekrój).
Operacje relacyjne - wynikają z faktu, że tabela jest
(wielo)zbiorem funkcji (krotek):
2.
Tab – zbiór wszystkich tabel utworzonych nad zbiorami Att i Val;
•
projekcja, przemianowanie, złączenie, selekcja
(+ pochodne: iloczyn kartezjański, złączenia zewnętrzne,
podzielenie).
9
10
Suma mnogościowa
Operacje mnogościowe – suma
R
• R, S – tabele jednakowego typu U,
• Wynik – tabela typu U.
• Suma mnogościowa (union):
R ∪ S = { t | t ∈ R ∨ t ∈ S}.
• SQL (UNION – usuwa duplikaty, UNION ALL – pozostawia duplikaty)
select * from R
union
select * from S
select * from Student
union
select * from Pracownik
Student
Pracownik
R ∪ S = { t | t ∈ R ∨ t ∈ S} –
wynik jest zbiorem, nie zawiera duplikatów
S
R ∪ALL S = { (k+j)*t | k*t ∈ R ∨ j*t ∈ S} –
wynik jest wielozbiorem, zawiera duplikaty.
(k*t ∈ R oznacza, że krotka t występuje k razy w
tabeli R)
Student ∪ALL Pracownik
select * from R
union all
select * from S
11
12
Operacje mnogościowe – różnica
•
•
•
R, S – tabele jednakowego typu U,
Wynik – tabela typu U.
Różnica mnogościowa (difference):
R – S = { t | t ∈ R ∧ t ∉ S}.
•
SQL (except – usuwa duplikaty):
Operacje mnogościowe – różnica
Student
select * from R
except
select * from S
•
Student – Pracownik
SQL (except – usuwa duplikaty):
select * from Student
except
select * from Pracownik
•
13
SQL (not exists):
select * from Student as S
where not exists (select * from Pracownik P
where S.Nazwisko=P.Nazwisko
and S.Kierunek = P.Kierunek)
14
Operacje mnogościowe – przekrój
Różnica mnogościowa
S
Pracownik
• R, S – tabele jednakowego typu U,
• Wynik – tabela typu U.
• Przekrój mnogościowy (intersection):
R ∩ S = { t | t ∈ R ∧ t ∈ S}.
S – R = { t | t ∈ S ∧ t ∉ R} –
wynik jest zbiorem, nie zawiera duplikatów
select * from S
except
select * from R
• SQL (intersect – usuwa duplikaty): :
R
S –LDup R = { k*t | k*t ∈ S ∧ t ∉ R} –
wynik jest wielozbiorem, zawiera duplikaty
select * from R
intersect
select * from S
select * from S
where not exists(
select * from R
where R.A = S.A and S.B=R.B)
15
16
Operacje mnogościowe – przekrój
Student
•
Pracownik
Student ∩ Pracownik
R
SQL (intersect – usuwa duplikaty):
select * from Student
intersect
select * from Pracownik
•
Przekrój mnogościowy
S
SQL (exists):
select * from Student as S
where exists (select * from Pracownik P
where S.Nazwisko=P.Nazwisko
and S.Kierunek = P.Kierunek)
17
R ∩ S = { t | t ∈ R ∧ t ∈ S} –
wynik jest zbiorem, nie zawiera duplikatów
select * from R
intersect
select * from S
R∩S=S∩R
R ∩LDup S = { k*t | k*t ∈ R ∧ t ∈ S} –
wynik jest wielozbiorem, zawiera duplikaty
select * from R
where exists(
select * from S
where R.A=S.A and S.B=R.B)
R∩S≠S∩R
18
Operacje na krotkach – przemianowanie
Operacje na krotkach – projekcja
Przykład:
π{A,C}([A:a, B:b, C:c]) = [A:a, C:c]
Przykład:
δA Æ D([A:a, B:b, C:c]) = [D:a, B:b, C:c].
Definicja (projekcja krotki na zbiór atrybutów)
Niech r będzie krotką typu U, i niech X będzie podzbiorem U, X ⊆ U.
Projekcją (rzutem, ograniczeniem) (ang. projection) krotki r na zbiór X,
co oznaczamy πX(r), nazywamy krotkę t typu X taką, która jest identyczna
z krotką r na zbiorze atrybutów X, tj.:
t = πX(r), jeśli dla każdego A ∈X, t.A = r. A.
(t.A oznacza wartość krotki t na atrybucie A).
Definicja (przemianowanie atrybutów w krotce)
Niech r będzie krotką typu U, B atrybutem w U i C atrybutem nie należącym do U. Przemianowaniem atrybutu B na C w krotce r, co oznaczamy
δB Æ C(r), nazywamy krotkę t powstałą z r przez zamianę atrybutu B na C,
tj. taką krotkę t typu U – {B} ∪ {C}, że:
t.A = r. A, dla każdego A ∈ U – {B},
t.C = t.B.
Gdy X jest zborem pustym (X = {}), to projekcja dowolnej krotki na X
jest krotką pustą, tj. π{}(t) = []
Uogólnienie na ciągi atrybutów:
Niech X=(B1, …, Bk) i Y=(C1, …, Ck) będą ciągami atrybutów,
X ⊆ U, Y ∩ U = {}.
Przemianowanie atrybutów z X na odpowiadające im atrybuty z Y w krotce r
definiujemy następująco:
δX Æ Y(r) = δBk Æ Ck(... (δB1 Æ C1(r))...).
Przykład:
π{}([A:a, B:b, C:c]) = [].
19
20
Operacje na krotkach – złączenie
Właściwości projekcji i złączenia krotek
Definicja (złączenie krotek)
Niech r będzie krotką typu X, a s – krotką typu Y. Jeśli zbiór r ∪ s jest
krotką, to nazywamy go złączeniem naturalnym r i s, i oznaczamy r ´ s.
Jeśli r ∪ s nie spełnia warunków krotki, to mówimy, że r i s są niezłączalne.
Przykłady:
[A:a,B:b,C:c] ´ [D:d,E:e] = [A:a,B:b,C:c,D:d,E:e] – krotki rozłącznych typów;
[A:a,B:b,C:c] ´ [B:b,E:e] = [A:a,B:b,C:c,E:e] – krotki nierozłącznych typów;
[A:a,B:b,C:c] ´ [] = [A:a,B:b,C:c] – złączenie z krotką pustą nie zmienia krotki;
(5)
π{}(t) = [] – wynikiem projekcji krotki na zbiór pusty jest krotka pusta [];
r ´ r = r – złączenie krotki z samą sobą nie zmienia krotki;
r ´ s = s ´ t – złączenie krotek jest przemienne;
r ´ (s ´ t) = (r ´ s) ´ t – złączenie krotek jest łączne;
[A:a, B:b, C:c] i [B:d, E:e] – krotki niezłączalne !
suma [A:a, B:b, C:c, B:d, E:e] nie jest krotką bo atrybut B występuje dwa
razy – raz z wartością 'b' i powtórnie z wartością 'd'.
r ´ [] = r – krotka pusta jest elementem neutralnym dla złączenia;
21
Spełnianie warunku przez krotkę
22
Spełnianie warunku przez krotkę
Definicja (warunek nad zbiorem atrybutów U)
Niech U będzie zbiorem atrybutów, a Const – zbiorem stałych
(liczb, tekstów). Niech:
A, A' ∈ U, c ∈ Const,
θ ∈ {=, !=, <, <=, >, >=, like, ... } – operator porównania.
Warunkiem nad U nazywamy wyrażenie logiczne E o następującej składni:
E ::= A θ c | A θ A' | (E ) | not E | E or E | E and E
Przykłady (3):
E := (Kierunek=’mat’ or Kierunek=‘fiz’)
(Kierunek=’mat’ or Kierunek=‘fiz’)([NrStud:2345, Kierunek:’mat’]) = TRUE
(Kierunek=’mat’ or Kierunek=‘fiz’)([NrStud:2345, Kierunek:’inf’]) = FALSE
(Kierunek=’mat’ or Kierunek=‘fiz’)([NrStud:2345, Kierunek:NULL]) = UNKNOWN
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.
Problem wartości pustych NULL
23
24
Spełnianie warunku przez krotkę
Krotki:
Operacje na tabelach
(4)
1. Projekcja:
r = [NrStud:2345, Kierunek:’mat’]
s = [NrStud:2346, Kierunek:NULL]
πX(R) = {πX(r) | r ∈ R }
Warunek:
2. Przemianowanie:
δX Æ Y(R) := {δX Æ Y(r) | r ∈ R }
E ≡ Kierunek=’mat’
Spełnianie:
E(r) = TRUE
E(s) != TRUE, E(s) = UNKNOWN
Uwaga:
Występowanie wartości NULL powoduje, że działamy w logice
trójwartościowej z wartościami logicznymi:
{TRUE, FALSE, UNKNOWN} (lub {T, F, U}).
3. Złączenie naturalne:
R ´ S = {r ´ s | r ∈ R, s ∈ S }
4. Selekcja:
Dowolne porównanie z NULL daje wartość logiczną UNKNOWN.
t.A θ NULL = UNKNOWN,
NULL θ x, daje UNKNOWN dla każdego x, również równego NULL.
σE(R ) = {r | r ∈ R ∧ E (r ) = TRUE}
25
26
Projekcja
Operacje na tabelach – projekcja
Projekcja:
πX(R) = {πX(r) | r ∈ R }
Problem duplikatów
Czy (pielęgniarka, 1 500,00) powinna dwa razy występować w
π{Stanowisko, Płaca} (Pracownik)?
- tak, jeśli chcemy wyliczyć średnią płacę,
- nie, jeśli sporządzamy wykaz stanowisk i płace na tych stanowiskach.
Szczególny przypadek:
27
π{}(R) = if R = {} then {} else {[]}
28
Projekcja
Operacje na tabelach – przemianowanie
Przemianowanie:
δA Æ B(R) := {δA Æ B(r) | r ∈ R }
SQL:
select Stanowisko, Płaca
from Pracownik
usuwanie duplikatów:
select distinct Stanowisko, Płaca
from Pracownik
29
Przemianowanie (przykł
(przykład)
30
Operacje na tabelach – złączenie
Dla relacji:
Studenci(IdStud, Nazwisko, Data_ur, Miejscowość)
Złączenie (naturalne):
R ´ S = {r ´ s | r ∈ R, s ∈ S }
δMiejscowość Æ Miasto(Studenci)
SQL:
select IdStud, Nazwisko, Data_ur, Miejscowość as Miasto
from Studenci
31
32
Złączenie naturalne (c.d.)
Złączenie naturalne (c.d.)
><
><
33
Złączenie naturalne (c.d.)
Złączenie naturalne (c.d.)
SQL:
W złączenie naturalnym dwóch tabel R i S typów odpowiednio X i Y:
• atrybuty występujące w X mogą występować także w Y,
• relacja wynikowa zawiera sumę atrybutów z X i Y (bez powtórzeń),
• łączone są te krotki, które na wspólnych atrybutach mają jednakowe
wartości.
35
select Nazwisko, P.Oddział, Ordynator
from
Pracownik P, Oddział O
where P.Oddział = O.Oddział
lub:
select Nazwisko, P.Oddział, Ordynator
from
Pracownik P join Oddział O
on P.Oddział = O.Oddział
36
Złączenie – właściwości
Złączenie – właściwości
Twierdzenie (właściwości złączenia naturalnego i kartezjańskiego)
R – tabela typu U, wówczas:
1.
R´S=S´R
Szczególne przypadki złączenia:
R – relacja typu X,
S – relacja typu Y.
1.
2.
3.
złączenie jest przemienne.
Jeśli X = Y, to R ´ S = R ∩ S
złączenie naturalne jest przekrojem mnogościowym.
Jeśli X ∩ Y = {}, to złączenie jest iloczynem kartezjańskim
(każda krotka z R łączy się z każdą krotką z S).
R ´ {[]} = R – wynikiem złączenia tabeli R z tabelą typu pustego
zawierającą krotkę pustą, jest tabela R;
4.
(4)
2.
3.
(R ´ S) ´ T = R ´ (S ´ T)
złączenie jest łączne.
Jeśli X ⊆ U, to R ´ πX (R) = R
złączenie tabeli R z dowolną swoją projekcją daje w wyniku R.
4.
Jeśli X ∪ Y = U, to R ⊆ πX(R) ´ πY(R)
tabela jest zawarta w złączeniu dowolnych dwóch swoich projekcji, których
suma typów jest równa typowi relacji.
Zachodzi zawieranie a nie równość (!).
R ´ {} = {}
– wynikiem złączenia tabeli R z pustą tabelą typu pustego,
jest tabela pusta;
37
38
Ilustracja właściwości (4)
πIdKli,IdTow(Sprz)
Sprz
IdKli
IdTow
Data
Ilustracja właściwości (4)
πIdKli,Data(Sprz)
πIdKli,IdTow(Sprz)
Sprz
IdKli
IdTow
Data
πIdKli,Data(Sprz)
IdKli
IdTow
IdKli
Data
IdKli
IdTow
IdKli
Data
a
x
1
a
x
a
1
a
x
1
a
x
a
1
a
x
2
a
y
a
2
a
x
2
a
y
a
2
a
y
2
b
y
b
3
a
y
2
b
y
b
3
b
y
3
b
y
3
´
Sprz ⊂ π{IdKli,IdTow}(Sprz) ´ π{IdKli,Data}(Sprz),
krotka [a, y, 1] nie należy do Sprz !
´
πIdKli,IdTow(Sprz) ´ πIdKli,Data(Sprz)
πIdKli,IdTow(Sprz) ´ πIdKli,Data(Sprz)
IdKli
IdKli
IdTow
Data
IdTow
Data
a
x
1
a
x
a
x
2
a
x
2
a
y
1
a
y
1
a
y
2
a
y
2
b
y
3
b
y
3
?
39
1
?
40
Selekcja - przykład
Operacje na tabelach – selekcja
Selekcja:
σE(R ) = {r | r ∈ R ∧ E (r ) = TRUE}
Wynikiem selekcji jest zbiór tych krotek tabeli R,
które spełniają warunek E.
select *
from
Studenci
where Data_ur > ’1981.12.31’ and Miejscowosc < > ‘Poznań’
41
42
Pochodne operacje na tabelach
Iloczyn kartezjański (c.d.)
P P×O O
Iloczyn kartezjański:
R M×N S = δX Æ M.X(R) ´ δY Æ N.Y(S)
SQL:
select P.Nazwisko, P.Oddział, O.Oddział, O.Ordynator
from
Pracownik P, Oddział O
Każda krotka z R jest łączona z każdą krotką z S.
Jeśli R ma nR kolumn i mR wierszy, a
lub
select P.*, O.*
from
Pracownik P, Oddział O
S ma nS kolumn i mS wierszy, to
R N×M S ma nR + nS kolumn i mR*mS wierszy.
43
44
Złączenie warunkowe,
θ-złączenie (θ-join)
Złączenia zewnętrzne
(OUTER JOIN)
Definicja (θ-złączenie)
Niech R i S będą tabelami typów odpowiednio X i Y, a E niech
będzie warunkiem selekcji nad zbiorem atrybutów X ∪ Y.
Złączeniem (warunkowym) tabel R i S, względem warunku E,
nazywamy selekcję złączenia naturalnego R i S względem
warunku E
R ´E S = σE (R ´ S),
Celem wprowadzenia złączenia zewnętrznego jest to, aby w relacji
wynikowej zawarte były wszystkie krotki należące do jednego z
argumentów (relacji leżącej po lewej bądź po prawej stronie
operatora), albo do obydwu tych argumentów i to niezależnie od
tego, czy dla danej krotki istnieje dopasowana do niej krotka
należąca do drugiej relacji, czy nie.
Wyróżniamy:
1. Złączenie zewnętrzne lewostronne - LEFT OUTER JOIN
2. Złączenie zewnętrzne prawostronne - RIGHT OUTER JOIN
3. Złączenie zewnętrzne pełne - FULL OUTER JOIN
45
Złączenie zewnętrzne lewostronne
LEFT OUTER JOIN (LOJ)
46
Złączenie zewnętrzne lewostronne
- przykład
Podaj dane o wszystkich studentów wraz z informacjami
o zdanych przez nich egzaminach:
Definicja
Niech R i S będą tabelami typów odpowiednio X i Y, a E niech będzie
warunkiem selekcji nad zbiorem atrybutów X ∪ Y.
Lewostronnym złączeniem zewnętrznym tabel R i S względem E, co
oznaczamy, R +´E S, nazywamy następującą tabelę typu X ∪ Y:
R +´E S = R ´E S ∪ {t ´ Null(Y – X) | t ∈ R – πX(R ´E S)}
Do wyniku należą więc wszystkie krotki lewego operanda (R) złączone
bądź z dopasowanymi krotkami tabeli S, bądź z wartościami NULL, gdy
brak dla nich w S dopasowanych krotek.
47
48
Złączenie zewnętrzne prawostronne
RIGHT OUTER JOIN (ROJ)
Złączenie zewnętrzne prawostronne
- przykład
Definicja
Niech R i S będą tabelami typów odpowiednio X i Y, a E niech będzie
warunkiem selekcji nad zbiorem atrybutów X ∪ Y.
Prawostronnym złączeniem zewnętrznym tabel R i S względem E, co
oznaczamy, R ´+E S, nazywamy następującą tabelę typu X ∪ Y:
R ´+E S = R ´E S ∪ {Null(X – Y) ´ t| t ∈ S – πY(R ´E S)}
Do wyniku należą więc wszystkie krotki prawego operanda (S) złączone
bądź z dopasowanymi krotkami tabeli R, bądź z wartościami NULL, gdy
brak dla nich w R dopasowanych krotek.
49
Złączenie zewnętrzne pełne
FULL OUTER JOIN (FOJ)
50
Złączenie zewnętrzne pełne -przykład
Podaj wszystkich studentów, wszystkich pracowników wraz z
informacjami o promotorstwie prac magisterskich.
Definicja
Niech R i S będą tabelami typów odpowiednio X i Y, a E niech będzie
warunkiem selekcji nad zbiorem atrybutów X ∪ Y.
Pełnym złączeniem zewnętrznym tabel R i S względem E, co
oznaczamy, R +´+E S, nazywamy sumę mnogościową złączeń lewo- i
prawostronnego tabel R i S względem warunku E:
R +´+E S = R +´E S ∪ R ´+E S
51
52
Podzielenie - przykład
Podzielenie (division)
Podaj numery studentów, którzy zdawali egzamin z każdego przedmiotu.
Definicja
Niech dane będą relacje R(U) i S(X) i niech X ⊆ U.
Podzieleniem relacji R(U) przez S(X) nazywamy relację R ÷ S, taką że:
R ÷ S := {t ∈ πU – X(R) | ∀ s ∈ S. t ´ s ∈ R}.
53
Podzielenie – wyrażenie za pomocą
innych operacji
T1 ← πNrStud(Egzamin)
T2 ← πU – X ((S ´ T1) – R)
T2 ← πNrStud((Przedmiot ´ T1) – Egzamin)
T = T1 – T2
Przedmiot ´ T1
Przedmiot
Podzielenie (c.d)
Podaj numery studentów, którzy zdawali egzamin z każdego przedmiotu.
T1 ← πU – X (R)
T = T1 – T2
54
´ T1 – Egzamin
Wyraża zapytanie typu „dla-każdego”
Schemat rozumowania (z podwójną negacją):
studenci, dla których nie istnieje przedmiot,
z którego nie zdawali egzaminu
select distinct E.NrStud
from Egzamin E
where not exists (select *
from Przedmiot P
where not exists (select *
from Egzamin E1
where E1.NrPrzed = P.NrPrzed and E1.NrStud = E.NrStud)))
55
56
Podzielenie (c.d)
{e.NrStud | Egzamin(E) ∧ ∀p(Przedmiot(p) ⇒
∃e1 (Egzamin(e1) ∧ e1.NrPrzed=p.NrPrzed ∧ e1.NrStud= e.NrStud))}
Zastąpienie ∀:
∀x(ϕ ⇒ ϕ’) ⇔ ¬ (∃x(ϕ ∧ ¬ϕ’))
{e.NrStud | Egzamin(E) ∧ ¬ ∃p(Przedmiot(p) ∧
¬ ∃e1 (Egzamin(e1) ∧ e1.NrPrzed=p.NrPrzed ∧ e1.NrStud= e.NrStud))}
select E.NrStud
from Egzamin E
where not exists (select *
from Przedmiot P
where not exists (select *
from Egzamin E1
where E1.NrPrzed = P.NrPrzed and E1.NrStud = E.NrStud)))
57

Podobne dokumenty