Relacyjne bazy danych
Transkrypt
Relacyjne bazy danych
Relacyjne bazy danych Tadeusz Pankowski www.put.poznan.pl/~tadeusz.pankowski 1 Model 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, ...). Relacyjne bazy danych są podstawą zachodniej cywilizacji 3 4 Baza danych Relacyjny model danych 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). 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): • struktura: • dane proste (atomowe), • krotki, • tabele (relacje); • operacje: • wyszukiwanie: operacje algebry relacji, rachunki relacji • operacje: definiowania, wyszukiwania, aktualizacji, administrowania (język SQL) • ograniczenia (warunki spójności) (więzy integralności): • zależności funkcyjne, zależności kluczowe (klucze główne), • zależności referencyjne, zależności zawierania (klucze obce), • ograniczenia na wartości (typy danych, dopuszczalne zbiory wartości, przedziały wartości), ... 5 6 Relacyjny model danych Relacyjne (SQL(SQL-owe) bazy danych Relacyjne bazy danych = SQL-owe bazy danych • wykraczają poza teoretyczny model relacyjny (włączają koncepcje obiektowości, XML, programowanie), SQL-owe bazy danych • standard SQL-92 • standard SQL:1999, SQL:2003, SQL:2006, SQL:2008 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). 7 8 Relacyjny model danych Algebra relacji 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). 9 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, δXY, ´, σE}), gdzie: Tab – zbiór wszystkich tabel utworzonych nad zbiorami Att i Val; ∪ – suma mnogościowa tabel (tego samego typu), – – różnica mnogościowa tabel (tego samego typu), πX – projekcja tabeli na zbiór atrybutów X, δXY – przemianowanie tabeli poprzez zmianę nazw kolumn z X na Y, ´ – złączenie naturalne tabel o dowolnych typach, σE – selekcja tabeli według warunku selekcji E. W języku algebry relacji istnieją: nazwy tabel (symbole relacyjne), które interpretowane są jako tabele, nazwy operacji (będą one tożsame z symbolami stosowanymi 10 powyżej). Operacje na tabelach (relacjach) Suma mnogościowa Dwie grupy operacji: 1. Operacje mnogościowe - wynikają z faktu, że tabela jest zbiorem: • suma, różnica, przekrój. Operacje relacyjne - wynikają z faktu, że tabela jest (wielo)zbiorem funkcji (krotek): 2. • • 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 Student union select * from Pracownik projekcja, przemianowanie, złączenie, selekcja (+ pochodne: iloczyn kartezjański, złączenia zewnętrzne, podzielenie). Student 11 Pracownik Student ∪ALL Pracownik 12 Różnica mnogościowa Suma mnogościowa R R ∪ S = { t | t ∈ R ∨ t ∈ S} – wynik jest zbiorem, nie zawiera duplikatów select * from R union select * from S 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): select * from R except select * from S R ∪ALL S = { (k+j)*t | k*t ∈ R ∨ j*t ∈ S} – wynik jest wielozbiorem, zawiera duplikaty. S • • • (k*t ∈ R oznacza, że krotka t występuje k razy w tabeli R) select * from R union all select * from S 13 14 Różnica mnogościowa Student Pracownik Różnica mnogościowa Student – Pracownik S S – R = { t | t ∈ S ∧ t ∉ R} – wynik jest zbiorem, nie zawiera duplikatów select * from S except select * from R • SQL (except – usuwa duplikaty): R select * from Student except select * from Pracownik • select * from S where not exists( select * from R where R.A = S.A and S.B=R.B) 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) S –LDup R = { k*t | k*t ∈ S ∧ t ∉ R} – wynik jest wielozbiorem, zawiera duplikaty 15 16 Przekrój Przekrój Student • R, S – tabele jednakowego typu U, • Wynik – tabela typu U. • Przekrój mnogościowy (intersection): R ∩ S = { t | t ∈ R ∧ t ∈ S}. Pracownik Student ∩ Pracownik • SQL (intersect – usuwa duplikaty): : • select * from R intersect select * from S select * from Student intersect select * from Pracownik • 17 S select * from Student as S where exists (select * from Pracownik P where S.Nazwisko=P.Nazwisko and S.Kierunek = P.Kierunek) 18 Przykład: π{A,C}([A:a, B:b, C:c]) = [A:a, C:c] 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 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). 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 SQL (exists): Operacje na krotkach – projekcja (rzut) krotki Przekrój R SQL (intersect – usuwa duplikaty): Gdy X jest zborem pustym (X = {}), to projekcja dowolnej krotki na X jest krotką pustą, tj. π{}(t) = [] Przykład: π{}([A:a, B:b, C:c]) = []. 19 20 Operacje na krotkach – przemianowanie (atrybutów w krotce) Operacje na krotkach – złączenie krotek Przykład: δA D([A:a, B:b, C:c]) = [D:a, B:b, C:c]. 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; 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 = r.B. 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. 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))...). [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'. 21 Właściwości projekcji i złączenia krotek π{}(t) = [] – wynikiem projekcji krotki na zbiór pusty jest krotka pusta []; 22 Spełnianie warunku przez krotkę (5) Krotki: r = [NrStud:2345, Kierunek:’mat’] s = [NrStud:2346, Kierunek:NULL] Warunek: r ´ r = r – złączenie krotki z samą sobą nie zmienia krotki; E = Kierunek = ‘mat’ E = (Kierunek = ‘mat’ or Kierunek = ‘fiz’) and NrStud ≠ 2345 Spełnianie: E(r) = (Kierunek = ‘mat’)([NrStud:2345, Kierunek:’mat’]) = TRUE E(s) ≠ TRUE, E(s) ≠ FALSE, ? E(s) = UNKNOWN, (E(s) = NULL) ! 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}). r ´ s = s ´ t – złączenie krotek jest przemienne; r ´ (s ´ t) = (r ´ s) ´ t – złączenie krotek jest łączne; r ´ [] = r – krotka pusta jest elementem neutralnym dla złączenia; 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. 23 24 Spełnianie warunku (logicznego) 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 Spełnianie warunku przez krotkę Przykłady (3): E := (Kierunek=‘mat’ or Kierunek=‘fiz’) (Kierunek=‘mat’ or Kierunek=‘fiz’)([NrStud:2345, Kierunek:’mat’]) = (‘mat’ = ‘mat’ or ‘mat’ = ‘fiz’) = TRUE (Kierunek=’mat’ or Kierunek=‘fiz’)([NrStud:2345, Kierunek:’inf’]) = (‘inf’ = ‘mat’ or ‘inf’ = ‘fiz’) = FALSE 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. (Kierunek=’mat’ or Kierunek=‘fiz’)([NrStud:2345, Kierunek:NULL]) = (NULL = ‘mat’ or NULL = ‘fiz’) = UNKNOWN 25 Operacje na tabelach 26 Operacje na tabelach – projekcja (4) 1. Projekcja: πX(R) = {πX(r) | r ∈ R } Projekcja: 2. Przemianowanie: δX Y(R) := {δX Y(r) | r ∈ R } πX(R) = {πX(r) | r ∈ R } 3. Złączenie naturalne: R ´ S = {r ´ s | r ∈ R, s ∈ S } 4. Selekcja: σE(R ) = {r | r ∈ R ∧ E (r ) = TRUE} 27 28 Projekcja Projekcja 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: SQL: select Stanowisko, Płaca from Pracownik usuwanie duplikatów: select distinct Stanowisko, Płaca from Pracownik π{}(R) = if R = {} then {} else {[]} 29 30 Operacje na tabelach – przemianowanie Przemianowanie (przykład) Dla relacji: Studenci(IdStud, Nazwisko, Data_ur, Miejscowość) Przemianowanie: δA B(R) := {δA B(r) | r ∈ R } δMiejscowość Miasto(Studenci) SQL: SELECT IdStud, Nazwisko, Data_ur, Miejscowość AS Miasto FROM Studenci 31 32 Operacje na tabelach – złączenie (naturalne) Złączenie naturalne (c.d.) Złączenie (naturalne): R ´ S = {r ´ s | r ∈ R, s ∈ S } >< 33 Złączenie naturalne (c.d.) 34 Złączenie naturalne (c.d.) >< 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. 36 Złączenie naturalne (c.d.) Złączenie naturalne tabel – właściwości (4) Szczególne przypadki złączenia: R – relacja typu X, S – relacja typu Y. 1. Jeśli X = Y, to R ´ S = R ∩ S dla tabel tego samego typu złączenie naturalne jest ich przekrojem. 2. Jeśli X ∩ Y = {}, to R ´ S = R × S dla tabel o rozłącznych typach złączenie naturalne jest ich iloczynem kartezjańskim (każda krotka z R łączy się z każdą krotką z S). 3. R ´ {[]} = R, (tzn. Y={}, S={[]}, uwaga {} = ∅) wynikiem złączenia tabeli R z tabelą zawierającą krotkę pustą (tabela typu pustego), jest tabela R. 4. R ´ {} = {}, (tzn. S={}) wynikiem złączenia tabeli R z tabelą pustą (dowolnego typu), jest tabela pusta. SQL: 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ł 37 Złączenie – właściwości Ilustracja właściwości (4) (4) Twierdzenie (właściwości złączenia naturalnego) R – tabela typu U, wówczas: 1. R´S=S´R πIdKli,IdTow(Sprz) Sprz IdKli (R ´ S) ´ T = R ´ (S ´ T) IdTow Data πIdKli,Data(Sprz) IdKli IdTow IdKli Data x 1 a x a 1 a x 2 a y a 2 a y 2 b y b 3 b y 3 a złączenie jest przemienne. 2. 38 złączenie jest łączne. 3. ´ Jeśli X ⊆ U, to R ´ πX (R) = R πIdKli,IdTow(Sprz) ´ πIdKli,Data(Sprz) złączenie tabeli R z dowolną swoją projekcją daje w wyniku R. 4. IdKli 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ść (!). Sprz ⊂ π{IdKli,IdTow}(Sprz) ´ π{IdKli,Data}(Sprz), krotka [a, y, 1] nie należy do Sprz ! 39 IdTow Data a x a x 1 2 a y 1 a y 2 b y 3 ? 40 Ilustracja właściwości (4) πIdKli,IdTow(Sprz) Sprz IdKli IdTow Data Operacje na tabelach – selekcja πIdKli,Data(Sprz) IdKli IdTow IdKli Data a x 1 a x a 1 a x 2 a y a 2 a y 2 b y b 3 b y 3 Selekcja: σE(R ) = {r | r ∈ R ∧ E (r ) = TRUE} ´ πIdKli,IdTow(Sprz) ´ πIdKli,Data(Sprz) IdKli a IdTow Wynikiem selekcji jest zbiór tych krotek tabeli R, które spełniają warunek E. Data x 1 a x 2 a y 1 a y 2 b y 3 ? 41 42 Pochodne operacje na tabelach – iloczyn kartezjański Selekcja - przykład Definicja: Jeśli R i S są tabelami rozłącznych typów, to ich złączenie naturalne nazywamy iloczynem kartezjańskim: R × S = R ´ S = {r ´ s | r ∈ R, s ∈ S }. Operacja iloczynu kartezjańskiego jest często poprzedzana operacją przemianowania, aby uzyskać rozłączne nazwy kolumn. Każda krotka z R jest łączona z każdą krotką z S. Jeśli R ma nR kolumn i mR wierszy, a S ma nS kolumn i mS wierszy, to: R × S ma • nR + nS kolumn i • mR*mS wierszy. select * from Studenci where Data_ur > ’1981.12.31’ and Miejscowosc < > ‘Poznań’ 43 44 Złączenie warunkowe, θ-złączenie łączenie ((θ θ-join) Iloczyn kartezjań kartezjański (c.d.) P P×O O Definicja (θ-złączenie) Niech R i S będą tabelami rozłącznych 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ę iloczynu kartezjańskiego R i S względem warunku E R ´E S = σE (R × S), SQL: select P.Nazwisko, P.Oddział, O.Oddział, O.Ordynator from Pracownik P, Oddział O lub select P.*, O.* from Pracownik P, Oddział O 45 Złączenia łączenia zewn zewnę ętrzne (OUTER JOIN) 46 Złączenie zewnętrzne lewostronne LEFT OUTER JOIN (LOJ) Definicja Niech R i S będą tabelami (rozłącznych) typów odpowiednio X i Y, a E niech będzie warunkiem selekcji nad zbiorem atrybutów X ∪ Y. 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: 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 ∪ (R – πX(R ´E S)) × Null(Y). 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. 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 47 48 Złączenie zewnętrzne pra prawostronne wostronne RIGHT OUTER JOIN (ROJ) 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 (rozłącznych) 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) × (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 50 Złączenie zewnętrzne pełne FULL OUTER JOIN (FOJ) Złączenie zewnętrzne pra prawostronne wostronne - 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. 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 Złączenie zewnętrzne pełne -przykład Podzielenie (division) Podaj wszystkich studentów, wszystkich pracowników wraz z informacjami o promotorstwie prac magisterskich. 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 54 Podzielenie – wyrażenie za pomocą innych operacji Podzielenie - przykład Podaj numery studentów, którzy zdawali egzamin z każdego przedmiotu. T1 ← πU – X (R) T1 ← πNrStud(Egzamin) T2 ← πU – X ((S × T1) – R) T2 ← πNrStud((Przedmiot × T1) – Egzamin) T = T1 – T2 T = T1 – T2 ´ T1 Przedmiot 55 Przedmiot ´ T1 – Egzamin 56 Podzielenie – wyrażenie za pomocą innych operacji Podzielenie (c.d) Podaj numery studentów, którzy zdawali egzamin z każdego przedmiotu. R(U) ÷ S(X) = {t ∈ πU – X(R) | ∀ s ∈ S (t ´ s ∈ R)}. Inaczej: R(U) ÷ S(X) = πU – X (R) – πU – X ((πU – X (R) × S) – R) R(U) ÷ S(X) = {t ∈ πU – X (R) | count({s ∈ πX (R) | t ´ s ∈ R}) = count(S)}. 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))) 57 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))) 59 58