Datenbanken Relationale Anfragesprachen (SQL) Tobias Galliat Sommersemester 2012 Professoren Studenten Vorlesungen MatrNr Name Semester 226 24002 Xenokrates 18 C4 232 25403 Jonas Kopernikus C3 310 26120 2133 Popper C3 52 26830 2134 Augustinus C3 309 2136 Curie C4 2137 Kant C4 PersNr Name Rang Raum 2125 Sokrates C4 2126 Russel 2127 VorlNr Titel SWS gelesen von 12 5001 Grundzüge 4 2137 Fichte 10 5041 Ethik 4 2125 Aristoxenos 8 5043 Erkenntnistheorie 3 2126 27550 Schopenhauer 6 5049 Mäeutik 2 2125 36 28106 Carnap 3 4052 Logik 4 2125 7 29120 Theophrastos 2 5052 Wissenschaftstheorie 3 2126 29555 Feuerbach 2 5216 Bioethik 2 2126 5259 Der Wiener Kreis 2 2133 5022 Glaube und Wissen 2 2134 4630 Die 3 Kritiken 4 2137 voraussetzen hören Vorgänger Nachfolger 5001 5041 MatrNr VorlNr 5001 5043 26120 5001 5001 5049 27550 5001 5041 5216 27550 4052 5043 5052 28106 5041 5041 5052 28106 5052 5052 5259 28106 5216 PerslNr Name Fachgebiet Boss 28106 5259 3002 Platon Ideenlehre 2125 29120 5001 3003 Aristoteles Syllogistik 2125 29120 5041 3004 Wittgenstein Sprachtheorie 2126 29120 5049 3005 Rhetikus Planetenbewegung 2127 Keplersche Gesetze 2 2127 prüfen Die relationale FH-DB Assistenten MatrNr VorlNr PersNr Note 28106 5001 2126 1 25403 5041 2125 2 29555 5022 3006 Newton 27550 4630 2137 2 25403 5022 3007 Spinoza Gott und Natur 2126 Datenmodell DBMS basieren auf Datenmodell: - Beschreibung der Struktur der Datenobjekte (Datenbankschema) Datendefinitionssprache (DDL) - Festlegung der anwendbaren Operatoren und deren Wirkung Datenmanipulationssprache (DML) Anfragesprache (interaktiv / eingebettet) Relationales Datenmodell SQL als DDL, DML und Anfragesprache 3 Datendefinition in SQL Datentypen: • Zeichenkette (string) - character(n) char(n) - character varying(n) varchar(n) • Zahl - integer - numeric(p,s) • Datum - date 4 Datendefinition in SQL • Anlegen einer neuen Tabelle: create table Professoren (PersNr integer primary key, Name varchar(30) not null, Rang char(2), Raum integer); Zugehörige relationale Modellierung: Professoren: {[PersNr: integer, Name: string, Rang: string, Raum: integer]} 5 Datendefinition in SQL • Löschen einer Tabelle: drop table Professoren; • Hinzufügen einer Spalte zu einer bestehenden Tabelle: alter table Professoren add liest integer; • Löschen einer Spalte: alter table Professoren drop liest; 6 Datenmanipulation in SQL • Einfügen von Tupeln: insert into Professoren values (2136, ‘Curie‘, ‘C4‘, 63); • Löschen von Tupeln: delete Professoren where PersNr = 2136; • Verändern von Tupeln: update Professoren set Raum = 36 where PersNr = 2136; 7 Einfache Anfragen in SQL • Selektion: z.B. Rang = ‘C4‘ (Professoren) select * from Professoren where Rang = ´C4´; PersNr Name Rang Raum 2125 Sokrates C4 226 2126 Russel C4 232 2136 Curie C4 36 2137 Kant C4 7 8 Einfache Anfragen in SQL • Projektion mit Duplikateliminierung: z.B. Rang(Professoren) select distinct Rang from Professoren; Rang C4 C3 9 Einfache Anfragen in SQL • Projektion ohne Duplikateliminierung: select SWS, gelesenVon from Vorlesungen; SWS gelesenVon 4 2137 4 2125 3 2126 2 2125 4 2125 3 2126 2 2126 2 2133 2 2134 4 2137 10 Einfache Anfragen in SQL • Projektion mit Sortierung: select PersNr, Name, Rang from Professoren order by Rang desc, Name asc PersNr Name Rang 2136 Curie C4 2137 Kant C4 2126 Russel C4 2125 Sokrates C4 2134 Augustinus C3 2127 Kopernikus C3 2133 Popper C3 11 Einfache Anfragen in SQL • Selektion mit Projektion und Sortierung: select PersNr, Name, Rang from Professoren PersNr where Rang = ´C4´ 2136 order by Name asc; Name Rang Curie C4 2137 Kant C4 2126 Russel C4 2125 Sokrates C4 12 SQL-Anfragen über mehrere Tabellen • Kartesisches Produkt mit Selektion und Projektion select Name, Titel from Professoren, Vorlesungen where PersNr = gelesenVon and Titel = `Mäeutik‘ ; Professoren PersNr Name Rang Raum 2125 Sokrates C4 226 2126 Russel C4 232 2127 Kopernikus C3 310 2133 Popper C3 52 2134 Augustinus C3 309 2136 Curie C4 36 2137 Kant C4 7 Vorlesungen VorlNr Titel SWS gelesenVon 5001 Grundzüge 4 2137 … … … … 5049 Mäeutik 2 2125 … … … … 4630 Die 3 Kritiken 4 2137 13 PersNr 2125 Name Sokrates Rang C4 Raum 226 VorlNr 5001 Titel Grundzüge SWS gelesenVon 4 2137 1225 Sokrates C4 226 5041 Ethik 4 2125 2125 Sokrates C4 226 5049 Mäeutik 2 2125 2126 2126 Russel Russel C4 C4 232 232 5001 5041 Grundzüge Ethik 4 4 2137 2125 2137 Kant C4 7 4630 Die 3 Kritiken 4 2137 Selektion PersNr Name Rang Raum VorlNr Titel SWS gelesenVon 2125 Sokrates C4 226 5049 Mäeutik 2 2125 Projektion Name Titel Sokrates Mäeutik 14 SQL-Anfragen über mehrere Tabellen • Join mit Selektion und Projektion select Name, Titel from Professoren join Vorlesungen on PersNr = gelesenVon where Titel = `Mäeutik‘ ; auch: left outer join, right outer join, full outer join 15 SQL-Anfragen über mehrere Tabellen • Welche Studenten hören welche Vorlesungen? select Name, Titel from Studenten, hören, Vorlesungen where Studenten.MatrNr = hören.MatrNr and hören.VorlNr = Vorlesungen.VorlNr; oder select s.Name, v.Titel from Studenten s, hören h, Vorlesungen v where s.MatrNr = h.MatrNr and h.VorlNr = v.VorlNr 16 Datenmanipulation in SQL (Fortsetzung) • Einfügen von Tupeln: insert into hören select MatrNr, VorlNr from Studenten, Vorlesungen where Semester = 2 and Titel= `Grundzüge‘ ; 17 Aggregatfunktionen und Gruppierung • Aggregatfunktionen: avg, max, min, sum, count (distinct) select max (Semester) from Studenten; select count(Rang) from Professoren; select count(distinct Rang) from Professoren; max(Semester) 18 count(Rang) 7 count(distinct Rang) 2 18 Aggregatfunktionen und Gruppierung • Gruppierung select gelesenVon, sum (SWS) from Vorlesungen group by gelesenVon; gelesenVon sum(SWS) 2137 8 2125 10 2126 8 2133 2 2134 2 SQL erzeugt pro Gruppe ein Ergebnistupel deshalb müssen alle in der select-Klausel aufgeführten Attribute - außer den aggregierten – auch in der group by-Klausel aufgeführt werden nur so kann SQL sicherstellen, dass sich das Attribut nicht innerhalb der Gruppe ändert 19 Nullwerte • ein unbekannter Attributwert wird als null gespeichert • Nullwerte entstehen oft im Zuge der Anfrageauswertung (z.B. bei äußeren Joins) • manchmal sehr überraschende Anfrageergebnisse, wenn Nullwerte beteiligt sind: Beispiel: select count (*) from Studenten where Semester < 13 or Semester > =13 Studenten, deren Semester-Attribut den Wert null hat, werden nicht mitgezählt! 20 Auswertung bei Nullwerten • arithmetische Ausdrücke: Wenn einer der Operanden null ist, wird auch das Ergebnis null. d.h. null + 1 = null, null * 0 = null • logische Ausdrücke: SQL verwendet eine dreiwertige Logik: true, false, unknown or true unknown false and true unknown false true true true true true true unknown false unknown true unknown unknown unknown unknown unknown false false true unknown false false false false false 21 Auswertung bei Nullwerten • In einer where-Bedingung werden nur Tupel selektiert, für die die Bedingung true ist. • Bei einer Gruppierung wird null als eigenständiger Wert aufgefaßt und in eine eigen Gruppe eingeordnet. • Mit dem Befehl is (not) null kann man auf Nullwerte prüfen: select count (*) from Studenten where Semester is null; • Logische Ausdrücke lassen sich mit is unknown testen. 22 Spezielle Sprachkonstrukte select * from Studenten where Semester > = 1 and Semester < = 4; Äquivalente Formulierungen: select * from Studenten where Semester between 1 and 4; select * from Studenten where Semester in (1,2,3,4); 23 Spezielle Sprachkonstrukte • Der Vergleich von Zeichenketten auf Ähnlichkeit mit like: select * from Studenten where Name like `T%eophrastos‘; Platzhalter % steht für beliebig viele (auch gar kein) Zeichen. 24 Spezielle Sprachkonstrukte • Das case-Konstrukt für die „Dekodierung“ von Attributwerten: select MatrNr, ( case when Note < 1.5 then ´sehr gut´ when Note < 2.5 then ´gut´ when Note < 3.5 then ´befriedigend´ when Note < 4.0 then ´ausreichend´ else ´nicht bestanden´ end) from prüfen; Die Alternativen (when-Klauseln) werden in der Reihenfolge ihres Auftretens ausgewertet. 25 Geschachtelte Anfragen • Unteranfrage in der where-Klausel Beispiel: Welche Prüfungen sind besser als durchschnittlich verlaufen? select * from prüfen where Note < ( select avg (Note) from prüfen ); 26 Geschachtelte Anfragen • Unteranfrage in der select-Klausel Beispiel: Ermittlung der Lehrbelastung der Professoren select PersNr, Name, ( select sum (SWS) as Lehrbelastung from Vorlesungen where gelesenVon = PersNr ) from Professoren; Beachte: Unteranfrage ist mit der äußeren Anfrage korreliert. Für jedes Ergebnistupel wird die Unteranfrage ausgeführt. 27 Entschachtelung korrelierter Unteranfragen (I) • Entschachtelung durch Join: select p.PersNr, p.Name, v.Lehrbelastung from Professoren p join ( select gelesenVon, sum(SWS) as Lehrbelastung from Vorlesungen group by gelesenVon ) v on p.PersNr = v.gelesenVon; 28 Quantifizierte Anfragen • Existenzquantor: select Name from Professoren where not exists ( select * from Vorlesungen where gelesen Von = PersNr ); Beachte: Unteranfrage ist mit der äußeren Anfrage korreliert. 29 Entschachtelung korrelierter Unteranfragen (II) • Entschachtelung durch Verwendung des Mengenvergleichs select Name from Professoren where PersNr not in ( select gelesenVon from Vorlesungen ); 30 Sichten Benutzer Sicht 1 Sicht 2 Sicht 3 Relation 1 Relation 2 Relation 3 31 Sichten • Definition einer Sicht: create view prüfenSicht as select MatrNr, VorlNr, PersNr from prüfen • Gründe für die Definition von Sichten: - Datenschutz (z.B. kein Zugriff auf die Note der Prüfung) - Vereinfachung von Anfragen create view StudProf (Sname, Semester, Titel, Pname) as select s.Name, s.Semester, v.Titel, p.Name from Studenten s, hören h, Vorlesungen v, Professoren p where s.Matr.Nr=h.MatrNr and h.VorlNr=v.VorlNr and v.gelesenVon=p.PersNr; select distinct Semester from StudProf where PName=`Sokrates‘; 32 Sichten - zur Modellierung von Generalisierungen create table Angestellte (PersNr integer not null, Name varchar(30) not null); create table ProfDaten (PersNr integer not null, Rang char(2), Raum integer); create table AssiDaten (PersNr integer not null, Fachgebiet varchar(30), Boss integer); create view Professoren as select * from Angestellte a, ProfDaten d where a.PersNr = d.PersNr; create view Assistenten as select * from Angestellte a, AssiDaten d where a.PersNr = d.PersNr; Untertypen als Sicht 33 Sichten create table Professoren (PersNr integer not null, Name varchar(30) not null, Rang char(2), Raum integer); create table Assistenten (PersNr integer not null, Name varchar(30) not null, Fachgebiet varchar(30), Boss integer); create table AndereAngestellte (PersNr integer not null, Name varchar (30) not null); create view Angestellte as (select PersNr, Name from Professoren) union (select PersNr, Name from Assistenten) union (select * from AndereAngestellte); Obertyp als Sicht 34 Update von Sichten • Sichten sind oft nicht änderbar (update-fähig): create view VorlesungenSicht as select Titel, SWS, Name from Vorlesungen, Professoren where gelesen Von=PersNr; Folgender Befehl würde vom DBMS als nicht zulässig zurückgewiesen: insert into VorlesungenSicht values (`Nihilismus‘, 2, `Nobody‘); 35 Update von Sichten • Die folgende Sicht ist ebenfalls nicht änderbar, da sie ein berechnetes Attribut enthält: create view WieHartAlsPrüfer (PersNr, Durchschnittsnote) as select PersNr, avg(Note) from prüfen group by PersNr; • Sichten in SQL sind änderbar, wenn - sie weder Aggregatfunktionen, Gruppierungen noch Duplikatelliminierung (distinct) enthalten - in der select-Liste nur eine Basisrelation oder veränderbare Sicht enthalten und der Schlüssel vorhanden ist 36