Ludwig Maximilians Universität München Institut für Informatik Lehr- und Forschungseinheit für Datenbanksysteme Skript zur Vorlesung Wintersemester 2006/2007 Vorlesung: Dr. Peer Kröger Übungen: Karsten Borgwardt, Dr. Peer Kröger Skript 2005 Christian Böhm http://www.dbs.informatik.uni-muenchen.de/lehre/dbs Begriff...das Kalkül der Kalkül... 2
Begriff Mathematik: Prädikatenkalkül Formeln wie {x x ΙN x 3 > 0 x 3 < 1000} Anwendung solcher Formeln für DB-Anfragen Bezugnahme auf DB-Relationen im Bedingungsteil: (x 1, y 1, z 1 ) Mitarbeiter, t 1 Abteilungen Terme werden gebildet aus Variablen, Konstanten usw. Atomare Formeln aus Prädikaten der Datentypen: =, <, >,, usw. Atomare Formeln können mit logischen Operatoren zu komplexen Formeln zusammengefasst werden: F 1 F 2, F 1 F 2, F 1, x: F 1, x: F 1 3 Bsp: Finde alle Großstädte in Bayern: {t t Städte t[land] = Bayern t[seinw] 500.000} Unterschied zur Rel. Algebra 4 Relationale Algebra ist prozedurale Sprache: Ausdruck gibt an, unter Benutzung welcher Operationen das Ergebnis berechnet werden soll WIE Relationen-Kalkül ist deklarative Sprache: Ausdruck beschreibt, welche Eigenschaften die Tupel der Ergebnisrelation haben müssen ohne eine Berechnungsprozedur dafür anzugeben WAS Es gibt zwei verschiedene Ansätze: Tupelkalkül: Variablen sind vom Typ Tupel Bereichskalkül: Variablen haben einfachen Typ
Der Tupelkalkül Man arbeitet mit Tupelvariablen: t Formeln: ψ(t) Ausdrücken: {t ψ(t)} Idee: Ein Ausdruck beschreibt die Menge aller Tupel, die die Formel ψ erfüllen (wahr machen) Ein Kalkül besteht immer aus Syntax: Wie sind Ausdrücke aufgebaut? Semantik: Was bedeuten die Ausdrücke? 5 Tupelvariablen Tupelvariablen haben ein definiertes Schema: Schema(t) = (A 1 : D 1, A 2 : D 2,...) Schema(t) = R 1 (t hat dasselbe Schema wie Relation) Für Zugriff auf die Komponenten t[a] oder t.a für einen Attributnamen A Schema(t) oder auch t[1], t[2] usw. Tupelvariable kann in einer Formel ψ frei oder gebunden auftreten (s. unten) 6
Atome Es gibt drei Arten von Atomen: R(t) R ist Relationenname, t Tupelvariable lies: t ist ein Tupel von R t[a] Θ s[b] t bzw. s sind zwei Tupelvariablen mit passenden Attributen lies: t[a] steht in Beziehung Θ zu... t[a] Θ c tist Tupelvariable und c eine passende Konstante Θ Vergleichsoperator: Θ {=, <,, >,, } 7 Formeln Der Aufbau von Formeln ψ ist rekursiv definiert: Atome: Verknüpfungen: Quantoren: Jedes Atom ist eine Formel Alle vorkommenden Variablen sind frei Sind ψ 1 und ψ 2 Formeln, dann auch: ψ 1 nicht (ψ 1 ψ 2 ) und (ψ 1 ψ 2 ) oder Alle Variablen behalten ihren Status. Ist ψ eine Formel, in der t als freie Variable auftritt, sind auch Formeln... ( t)(ψ) es gibt ein t, für das ψ ( t)(ψ) für alle t gilt ψ die Variable t wird gebunden. 8
Formeln 9 Gebräuchliche vereinfachende Schreibweisen: ψ 1 ψ 2 für ( ψ 1 ) ψ 2 (Implikation) t 1,...,t k : ψ(t 1,...t k ) für ( t 1 ) (...(( t k ) (ψ(t 1,...t k )))...) ( t R) (ψ(t)) für ( t) (R(t) ψ(t)) ( t R) (ψ(t)) für ( t) (R(t) ψ(t)) Bei Eindeutigkeit können Klammern weggelassen werden Beispiel: ( s)(s[a] u[b] ( u)(r(u) u[c] > t[d])) t ist s ist frei gebunden u ist frei beim ersten Auftreten und dann gebunden Ausdruck (Anfrage) Ein Ausdruck des Tupelkalküls hat die Form {t ψ(t)} In Formel ψ ist t die einzige freie Variable 10
Semantik Bedeutung, die einem korrekt gebildeten Ausdruck durch eine Interpretation zugeordnet wird: Syntax Tupelvariablen Formeln Ausdrücke Interpretation Semantik konkrete Tupel true, false Relationen 11 Belegung von Variablen Gegeben: eine Tupelvariable t mit Schema(t) = (D 1, D 2,...) eine Formel ψ(t), in der t frei vorkommt ein beliebiges konkretes Tupel r (d.h. mit Werten). Es muß nicht zu einer Relation der Datenbank gehören Bei der Belegung wird jedes freie Vorkommen von t durch r ersetzt. Insbesondere wird t[a] durch den Attributwert von r[a] ersetzt. Man schreibt: ψ(r t) 12
Beispiel Gegeben sei folgendes Relationenschema: Städte (SName: String, SEinw: Integer, Land: String) Länder (LName: String, LEinw: Integer, Partei * : String) * bei Koalitionsregierungen: jeweils eigenes Tupel pro Partei ψ(t) = (t.land=bayern t.seinw 500.000) mit Schema(t) = Schema(Städte) r 1 = (Passau, 49800, Bayern): ψ(r 1 t) = (Bayern = Bayern 49800 500.000) r 2 = (Bremen, 535.058, Bayern): ψ(r 2 t) = (Bremen = Bayern 535.058 500.000) 13 Interpretation von Formeln Interpretation I(ψ) analog zu syntaktischem Aufbau Anm: Alle Variablen sind durch konkrete Tupel belegt Atome: R(r): I(R(r)) = true r ist in R enthalten c i Θ c j : I(c i Θ c j ) = true der Vergleich ist erfüllt Logische Operatoren: ψ: I( ψ) = true I(ψ) = false ψ 1 ψ 2 : I(ψ 1 ψ 2 )=true I(ψ 1 )=true und I(ψ 2 )=true ψ 1 ψ 2 : I(ψ 1 ψ 2 )=true I(ψ 1 )=true oder I(ψ 2 )=true 14
Beispiele Atome: I(Städte (Passau, 49.800, Bayern) ) =? true I(49.800 500.000) =? false Logische Operatoren: I( 49.800 500.000) =? true I(Städte (Passau, 49.800, Bayern) 49.800 500.000) =? true I(Städte (Passau, 49.800, Bayern) 49.800 500.000) =? false 15 Interpretation von Quantoren Interpretation I(( s)(ψ)) bzw. I(( s)(ψ)): In ψ darf nur s als freie Variable auftreten. I(( s)(ψ)) = true ein Tupel r D 1 D 2... existiert, daß bei Belegung der Variablen s die Formel ψ gilt: I(ψ(r s) ) = true I(( s)(ψ)) = true für alle Tupel r D 1 D 2... gilt die Formel ψ. Beispiele: I(( s)(städte(s) s.land = Bayern)) =? true I(( s)(s.name = Passau)) =? false 16
Interpretation von Ausdrücken Interpretation von Ausdruck I({t ψ(t)}) stützt sich auf Belegung von Variablen und Interpretation von Formeln Gegeben: E = {t ψ(t)} t die einzige freie Variable in ψ(t) Schema(t) = D 1 D 2... Dann ist der Wert von E die Menge aller * (denkbaren) Tupel r D 1 D 2... für die gilt: I(ψ(r t)) = true * Grundmenge sind hier nicht nur die gespeicherten Tupel aus der DB 17 Beispiel-Anfragen Gegeben sei folgendes Relationenschema: Städte (SName: String, SEinw: Integer, Land: String) Länder (LName: String, LEinw: Integer, Partei * : String) * bei Koalitionsregierungen: jeweils eigenes Tupel pro Partei Finde alle Großstädte (SName, SEinw, Land) in Bayern: {t Städte(t) t[land] = Bayern t[seinw] 500.000} In welchem Land liegt Passau? Schema(t) = (Land:String) {t ( u Städte)(u[Sname] = Passau u[land] = t[land]} Finde alle Städte in CDU-regierten Ländern: {t Städte(t) ( u Länder)(u[Lname]=t[Land] u[partei]=cdu)} 18
Beispiel-Anfragen Gegeben sei folgendes Relationenschema: Städte (SName: String, SEinw: Integer, Land: String) Länder (LName: String, LEinw: Integer, Partei * : String) * bei Koalitionsregierungen: jeweils eigenes Tupel pro Partei Welche Länder werden von der SPD allein regiert? {t Länder(t) ( u Länder)(u[LName]=t[LName] u[partei]=spd} Gleichbedeutend mit: {t Länder(t) ( u Länder) (u[lname]=t[lname] u[partei] SPD} 19 Sichere Ausdrücke Mit den bisherigen Definitionen ist es möglich, unendliche Relationen zu beschreiben: Schema(t) = {String, String} {t t[1] = t[2] } Ergebnis: {(A,A),(B,B),...,(AA,AA),(AB,AB),...} Probleme: Ergebnis kann nicht gespeichert werden Ergebnis kann nicht in endlicher Zeit berechnet werden Definition: Ein Ausdruck heißt sicher, wenn jede Tupelvariable nur Werte einer gespeicherten Relation annehmen kann, also positiv in einem Atom R(t) vorkommt. 20
Der Bereichskalkül Tupelkalkül: Tupelvariablen t (ganze Tupel) Bereichskalkül: Bereichsvariablen x 1 :D 1, x 2 :D 2,... für einzelne Attribute (Bereich=Wertebereich=Domäne) Ein Ausdruck hat die Form: {x 1, x 2,... ψ (x 1, x 2,...)} Atome haben die Form: R 1 (x 1, x 2,...): Tupel (x 1, x 2,...) tritt in Relation R 1 auf x Θ y: x,y Bereichsvariablen bzw. Konstanten Θ {=, <,, >,, } Formeln analog zum Tupelkalkül 21 Beispiel-Anfragen Städte (SName: String, SEinw: Integer, Land: String) Länder (LName: String, LEinw: Integer, Partei * : String) * bei Koalitionsregierungen: jeweils eigenes Tupel pro Partei In welchem Land liegt Passau? {x 3 x 1, x 2 : (Städte(x 1, x 2, x 3 ) x 1 = Passau) } oder auch {x 3 x 2 : (Städte(Passau, x 2, x 3 ) ) } Finde alle Städte in CDU-regierten Ländern: {x 1 x 2, x 3, y 2 : (Städte(x 1,x 2,x 3 ) Länder (x 1,y 2,CDU))} Welche Länder werden von der SPD allein regiert? {x 1 x 2 :(Länder(x 1,x 2,SPD) y 3 :(Länder(x 1,x 2,y 3 ) y 3 SPD))} 22
Query By Example (QBE) Beruht auf dem Bereichskalkül Ausdrücke nicht wie in SQL als Text Dem Benutzer wird am Bildschirm ein Tabellen-Gerüst angeboten, das mit Spezial-Editor bearbeitet werden kann Nach Eintrag von Werten in das Tabellengerüst (Anfrage) füllt das System die Tabelle Zielgruppe: Gelegentliche Benutzer 23 Query By Example (QBE) Relationenname Attribute Komplexe Bedingungen Conditions 24 Kommandos Anfrage-Spezifikation Sprachelemente: Kommandos, z.b. P. (print), I. (insert), D. (delete)... Bereichsvariablen (beginnen mit _ ): _x, _y Konstanten (Huber, Milch) Vergleichsoperatoren und arithmetische Operatoren Condition-Box: Zusätzlicher Kasten zum Eintragen einer Liste von Bedingungen (AND, OR, kein NOT)
Beispiel-Dialog 25 Beginn: leeres Tabellengerüst Benutzer gibt interessierende Relation und P. ein Kunde P. System trägt Attributsnamen der Relation ein Kunde KName KAdr Kto Benutzer stellt Anfrage Kunde KName KAdr Kto P. P. <0 System füllt Tabelle mit Ergebnis-Werten Kunde KName KAdr Huber Innsbruck Maier München evtl. weitere Tabelle (Join) Anfragen mit Bedingungen Welche Lieferanten liefern Mehl oder Milch? P. P. _w Freie Variablen Bereichsvariable CONDITIONS _w=mehl OR _w=milch Bedeutung: {x 1, x 2 w, x 4 :Lieferant(x 1,x 2,w,x 4 ) (w=mehl w=milch)} Kommando P. für print bzw. auch für die Projektion 26
Anfragen mit Bedingungen Welche Lieferanten liefern Brie und Perrier, wobei Gesamtpreis 7,00 nicht übersteigt? P. _L Brie _y _L Perrier _z CONDITIONS _y + _z <= 7.00 Bedeutung: {l x 1, x 2, y, z: Lieferant (l, x 1, Brie, y) Lieferant (l, x 2, Perrier, z) y + z 7.00} 27 Join-Anfragen Welcher Lieferant liefert etwas das Huber bestellt hat? P. _w Auftrag KName Ware Menge Huber _w Bedeutung: {x 1 x 2, w, x 4, y 3 : Lieferant (x 1, x 2, w, x 4 ) Auftrag (Huber, w, y 3 )} Beachte: Automatische Duplikat-Elimination in QBE 28
Join-Anfragen Abkürzung! 29 Meist ist für Ergebnis neues Tabellengerüst nötig: Beispiel: Bestellungen mit Kontostand des Kunden Falsch (leider nicht möglich): Kunde KName KAdr Kto P. _n P. Auftrag KName Ware Menge _n P. P. Richtig: Kunde KName KAdr Kto _n _k Auftrag KName Ware Menge _n _w _m Bestellung Name Was Wieviel Kontostand P. P. _n P. _w P. _m P. _k Anfragen mit Ungleichung Wer liefert Milch zu Preis zw. 0,50 und 0,60? Variante mit zwei Zeilen: P. _L Milch >= 0.5 _L Milch <= 0.6 Variante mit Condition-Box P. Milch _p 30 CONDITIONS _p >= 0.5 AND _p <= 0.6
Anfragen mit Negation Finde für jede Ware den billigsten Lieferanten P. _w _p _w < _p Das Symbol in der ersten Spalte bedeutet: Es gibt kein solches Tupel Bedeutung: {x 1, x 2, w, p y 1, y 2, y 3 : Lieferant (x 1, x 2, w, p) Lieferant (y 1, y 2, w, y 3 ) y 3 < p} 31 Einfügen Einfügen von einzelnen Tupeln Kommando I. für INSERT Kunde KName KAdr Kto I. Schulz Wien 0 Einfügen von Tupeln aus einem Anfrageergebnis Beispiel: Alle Lieferanten in Kundentabelle übernehmen Kunde KName KAdr Kto I. _n _a 0 _n _a 32
Löschen und Ändern Löschen aller Kunden mit negativem Kontostand Kunde KName KAdr Kto D. < 0 Ändern eines Tupels (U. für UPDATE) Kunde KName KAdr Kto Schulz Wien U. 100 oder auch: Kunde KName KAdr Kto Meier _a _k U. Meier _a _k 110 oder auch mit Condition-Box 33 Vergleich QBE Konstanten Bereichsvariablen leere Spalten Spalten mit P. Spalten ohne P. Bereichskalkül Konstanten Bereichsvariablen paarweise verschiedene Bereichsvariablen, -quantifiziert freie Variablen -quantifizierte Variablen 34 Anmerkung: QBE ist relational vollständig, jedoch ist für manche Anfragen der relationalen Algebra eine Folge von QBE-Anfragen nötig
Umsetzung einer QBE-Anfrage (ohne Negation) Erzeuge für alle Attribute A i aller vorkommenden Tabellen-Zeilen der Anfrage eine Bereichsvariable x i Steht bei Attribut A i das Kommando P. dann schreibe x i zu den freien Variablen ({... x i,......}), sonst binde x i mit einem -Quantor ({......, x i,...}) Binde alle Variablen der Anfrage mit einem -Quantor P. P. P. _w Auftrag KName Ware Menge Huber _w >= 5 35 {x 1, x 2, x 3 x 4, x 5, x 6, x 7, w:... Umsetzung einer QBE-Anfrage P. P. P. _w Auftrag KName Ware Menge Huber _w >= 5 Füge für jede vorkommende Relation R ein Atom der Form R(x i, x i+1,...) mit an die Formel Ψ an {x 1,x 2,x 3 x 4,x 5,x 6,x 7,w: Lieferant(x 1,x 2,x 3,x 4 ) Auftrag(x 5,x 6,x 7 )... Steht bei A i ein Zusatz der Form Const bzw. Const etc., dann hänge x i = Const bzw. x i Const mit an Formel. {x 1,x 2,x 3 x 4,x 5,x 6,x 7,w: Lieferant(x 1,x 2,x 3,x 4 ) Auftrag(x 5,x 6,x 7 ) x 5 = Huber x 7 5 36
Umsetzung einer QBE-Anfrage P. P. P. _w Auftrag KName Ware Menge Huber _w >= 5 Gleiches Vorgehen bei Zusätzen der Form _Variable bzw. _Variable usw: {x 1,x 2,x 3 x 4,x 5,x 6,x 7,w: Lieferant(x 1,x 2,x 3,x 4 ) Auftrag(x 5,x 6,x 7 ) x 5 =Huber x 7 5 w = x 3 w = x 6 } Ggf. wird der Inhalt der Condition-Box mit angehängt. Meist lässt sich der Term noch vereinfachen: 37 {x 1,x 2,w x 4,x 5,x 7 : Lieferant(x 1,x 2,w,x 4 ) Auftrag(Huber,w,x 7 ) x 7 5}