Kapitel 5 Dr. Brigitte Mathiak SQL DDL + DML Lernziele Fähigkeit zur praktischen Anwendung von SQL-Anweisungen in den Bereichen: Schema-Definitionen einschl. referentieller Integrität Einfügen von Daten Ändern von Daten Löschen von Daten Varianten von SQL kennen lernen Datenbanken, WS 12/13 Kapitel 5: SQL2 2 SQL: Komponenten der vollständigen DB-Sprache Datenmanipulation (Data Manipulation Language DML) Einfügen, Löschen und Ändern von individuellen Tupeln In und von Mengen von Tupeln Zuweisung von ganzen Relationen diesem Kapitel Datendefinition (Data Definition Language DDL) Definition von Wertebereichen, Attributen und Relationen In Definition von verschiedenen Sichten auf Relationen diesem Kapitel Datenkontrolle Spezifikation von Bedingungen zur Zugriffskontrolle Spezifikation von Zusicherungen (assertions) zur semantischen Integritätskontrolle Datenabfragen Abbildung von Eingaberelationen durch Auswertung von Bedingungen Das war Kapitel auf die Ergebnisrelation 2 Kopplung mit einer Wirtssprache (z.B. C++) deskriptive Auswahl von Mengen von Tupeln sukzessive Bereitstellung einzelner Tupeln Datenbanken, WS 12/13 Kapitel 5: SQL2 3 Beispiel: Universitätsschema * Studenten MatrNr Name Semester hören * * voraussetzen Vorlesungen * VorlNr Titel SWS * * lesen Prüfen Note 1 1 Professoren PersNr Name Rang Raum Datenbanken, WS 12/13 Kapitel 5: SQL2 Assistenten arbeitenFür 1 * PersNr Name Fachgebiet 4 Studenten Professoren Rang Raum MatrNr Vorlesungen Name Semester 24002 Xenokrates 18 232 25403 Jonas 2127 Kopernikus C3 310 26120 2133 C3 52 26830 2134 Augustinus C3 309 2136 Curie C4 36 2137 Kant C4 7 PersNr Name 2125 Sokrates C4 226 2126 Russel C4 Popper voraussetzen VorlNr Titel 12 5001 Grundzüge 4 2137 Fichte 10 5041 Ethik 4 2125 Aristoxenos 8 5043 Erkenntnistheorie 3 2126 27550 Schopenhaue r 6 5049 Mäeutik 2 2125 4052 Logik 4 2125 28106 3 5052 Wissenschaftstheori e 3 2126 5216 Bioethik 2 2126 5259 Der Wiener Kreis 2 2133 5022 Glaube und Wissen 2 2134 4630 Die 3 Kritiken 4 2137 Carnap 29120 Theophrastos 2 29555 2 Vorgänger Nachfolger Feuerbach hören 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 prüfen 29120 5001 MatrNr VorlNr PersNr Note 29120 5041 28106 5001 2126 1 29120 5049 25403 5041 2125 2 25403 5022 Datenbanken, WS 12/13 Kapitel 5: SQL2 SWS gelesenV on Assistenten PerslNr Name Fachgebiet Boss 3002 Platon Ideenlehre 2125 3003 Aristoteles Syllogistik 2125 3004 Wittgenstein Sprachtheorie 2126 3005 Rhetikus Planetenbewegung 2127 3006 Newton Keplersche Gesetze 2127 3007 Spinoza Gott und Natur 2126 5 Relationale Invarianten Integritätsbedingungen des Relationenmodells Primärschlüsselbedingung (Entity-Integrität) - Eindeutigkeit des Primärschlüssels - keine Nullwerte! Referentielle Integrität: - Darstellung von Beziehungen durch Fremdschlüssel (foreign key): Attribut, das in Bezug auf den Primärschlüssel einer anderen (oder derselben) Relation definiert ist - zugehöriger Primärschlüssel muss existieren, d.h. zu jedem Wert (ungleich Null) eines Fremdschlüsselattributs einer Relation R2 muss ein gleicher Wert des Primärschlüssels in irgendeinem Tupel von Relation R1 vorhanden sein Datenbanken, WS 12/13 Kapitel 5: SQL2 6 Relationale Invarianten (1) Fremdschlüssel und zugehöriger Primärschlüssel tragen wichtige interrelationale Informationen sie sind auf dem gleichen Wertebereich definiert sie gestatten die Verknüpfung von Relationen mit Hilfe von Relationenoperationen Fremdschlüssel können Nullwerte aufweisen, wenn sie nicht Teil eines Primärschlüssels sind. ein Fremdschlüssel ist „zusammengesetzt“, wenn der zugehörige Primärschlüssel „zusammengesetzt“ ist Eine Relation kann mehrere Fremdschlüssel besitzen, die die gleiche oder verschiedene Relationen referenzieren Zyklen sind möglich (geschlossener referentieller Pfad) Eine Relation kann zugleich referenzierende und referenzierte Relation sein („self-referencing table“). Datenbanken, WS 12/13 Kapitel 5: SQL2 7 SQL: DDL Anweisungen DDL-Spezifikation in SQL bei CREATE TABLE: Professoren Assistenten PersNr Name Fachgebiet Boss PersNr Name Rang Raum 3002 Platon Ideenlehre 2125 2125 Sokrates C4 226 3003 Aristoteles Syllogistik 2125 2126 Russel C4 232 3004 Wittgenstein Sprachtheorie 2126 2127 Kopernikus C3 310 3005 Rhetikus Planetenbewegung 2127 2133 Popper C3 52 3006 Newton Keplersche Gesetze 2127 2134 Augustinus C3 309 3007 Spinoza Gott und Natur 2126 2136 Curie C4 36 2137 Kant C4 7 CREATE TABLE Assistenten (PersNr INT PRIMARY KEY, Name VARCHAR2 (100) NOT NULL, Fachgebiet VARCHAR2(100), Boss INT REFERENCES Professoren(PersNr)); Datenbanken, WS 12/13 Kapitel 5: SQL2 8 (Einfache) Datendefinition in SQL CREATE TABLE <tablename> ( <columnname> <Datentyp> <Constraint>, <columnname2> …, … ) Wichtige Datentypen in Oracle: varchar2 (n) für Strings variabler Länge NUMBER(p,s) für Zahlen mit der angegebenen Genauigkeit PLS_INTEGER für Integerwert (bessere Performanz) blob oder raw für sehr große binäre Daten clob für sehr große String-Attribute date für Datumsangaben xml für XML-Dokumente … Datenbanken, WS 12/13 Kapitel 5: SQL2 9 Constraints Mehr zu Constraints im Kapitel Integritätsbedingungen hier nur kurz die wichtigsten: • PRIMARY KEY für den Primärschlüssel • REFERENCES rel(col) für einen Fremdschlüssel, der auf die Relation rel und die Spalte col zeigt • UNIQUE wenn es keine Duplikate in der Spalte geben darf (PRIMARY KEY ist automatisch UNIQUE) • NOT NULL wenn Nullwerte nicht zugelassen sind Datenbanken, WS 12/13 Kapitel 5: SQL2 10 Schemaänderungen ALTER TABLE <table_name> RENAME TO <new_table_name>; Beispiel: ALTER TABLE suppliers RENAME TO vendors; Statt RENAME TO gibt es auch eine Reihe anderer Änderungsmöglichkeiten z.B. • ADD <column> <Datentyp> <Constraint> • MODIFY <column> <neuer_Datentyp> <neues_Constraint> • DROP <column> • RENAME COLUMN <column> TO <neuer_Name> Datenbanken, WS 12/13 Kapitel 5: SQL2 11 Veränderung am Datenbestand Einfügen von Tupeln: MatrNr Studenten Name Semester 29120 29555 28121 Theophrastos Feuerbach Archimedes 2 2 - insert into Studenten (MatrNr, Name) values (28121, 'Archimedes'); insert into hören select MatrNr, VorlNr Null-Wert from Studenten, Vorlesungen where Titel= 'Logik' ; Datenbanken, WS 12/13 Kapitel 5: SQL2 12 Veränderungen am Datenbestand Löschen von Tupeln delete Studenten where Semester > 13; Verändern von Tupeln update Studenten set Semester = Semester + 1; Datenbanken, WS 12/13 Kapitel 5: SQL2 13 Assistenten Professoren PersNr Name Fachgebiet Boss PersNr Name Rang Raum 3002 Platon Ideenlehre 2125 2125 Sokrates C4 226 3003 Aristoteles Syllogistik 2125 2126 Russel C4 232 3004 Wittgenstein Sprachtheorie 2126 2127 Kopernikus C3 310 3005 Rhetikus Planetenbewegung 2127 2133 Popper C3 52 3006 Newton Keplersche Gesetze 2127 2134 Augustinus C3 309 3007 Spinoza Gott und Natur 2126 2136 Curie C4 36 2137 Kant C4 7 CREATE TABLE Assistenten (PersNr INT PRIMARY KEY, Name VARCHAR2 (100) NOT NULL, Fachgebiet VARCHAR2(100), Boss INT REFERENCES Professoren(PersNr)); Aufgabe: Denken Sie sich eine Insert, eine Delete und eine Update Anweisung aus, die vom System abgelehnt werden. (Jeder für sich mit Zettel und Stift; 5 min) Zusatzaufgabe: Denken Sie sich ein Alter Table aus, dass vom System abgelehnt wird Datenbanken, WS 12/13 Kapitel 5: SQL2 14 Bootstrapping CREATE TABLE Sekretärin (PersNr INT PRIMARY KEY, … Boss INT REFERENCES Professor(PersNr)); CREATE TABLE Professor (PersNr INT PRIMARY KEY, … Sekräterin INT REFERENCES Sekretärin(PersNr)); Was geht da schief? Welche Tabelle lege ich zuerst an? Welche Daten füge ich zuerst ein? Datenbanken, WS 12/13 Kapitel 5: SQL2 15 Bootstrapping (Lösungen) •ALTER TABLE MODIFY COLUMN Boss INT REFERENCES Professor(PersNr); •Bei der Datenmodellierung darauf achten, solche zyklischen Abhängigkeiten zu vermeiden •Transaktionen (s. spätere Kapitel) Es werden mehrere Operationen gleichzeitig ausgeführt •Insert into Sekretärin values (4, …, Null); Insert into Professor values (7, …, 4); Update Sekretärin Set Boss = 7 Where PersNr = 4 ; Datenbanken, WS 12/13 Kapitel 5: SQL2 16 Varianten von SQL Nicht alle Versionen von SQL sind identisch Neben syntaktischen Varianten sind insbesondere die verschiedenen Join Operatoren und Lösungen für das Rekursionsproblem relevant. Achtung: Benutzen Sie in der Klausur ausschließlich Standardsyntax !!! Datenbanken, WS 12/13 Kapitel 5: SQL2 17 Joins in SQL-92 cross join: Kreuzprodukt select * from R1, R2; natural join: natürlicher Join Join oder inner join: Theta-Join left, right oder full outer join: äußerer Join union join: Vereinigungs-Join (wird hier nicht vorgestellt) Inner Join Anfrage: welcher Professor bietet welche Vorlesungen an? SELECT p.Name, v.Name FROM Professoren p JOIN Vorlesungen v ON p.PersNr = v.gelesenVon ; SELECT p.Name, v.Name FROM Professoren p, Vorlesungen v WHERE p.PersNr = v.gelesenVon ; Datenbanken, SS 12 Kapitel 2: SQL Anfragen 19 Natural Join Anfrage: Welcher Student hört welche Vorlesung? SELECT Studenten.Name, Vorlesungen.Name FROM Studenten NATURAL JOIN hören NATURAL JOIN Vorlesungen ; SELECT s.Name, v.Name FROM Studenten s, hören h, Vorlesungen v WHERE s.MatrNr = h.MatrNr AND h.VorlNr = v.vorlNr ; Datenbanken, SS 12 Kapitel 2: SQL Anfragen 20 Cross Join Anfrage: alle Paare "Professor – Student" : SELECT Professoren.Name, Studenten.Name FROM Professoren CROSS JOIN Studenten ; SELECT p.Name, s.Name FROM Professoren p, Studenten s ; Datenbanken, SS 12 Kapitel 2: SQL Anfragen 21 Outer Joins: Left Outer Join SELECT p.PersNr, p.Name, f.PersNr, f.Note, f.MatrNr, s.MatrNr, s.Name FROM Professoren p LEFT OUTER JOIN ( prüfen f LEFT OUTER JOIN Studenten s ON f.MatrNr = s.MatrNr ) ON p.PersNr = f.PersNr ; p.PersN f.PersN f.Not f.MatrN p.Name r r e r 2126 Russel 2126 1 28106 Sokrate 2125 2125 2 25403 s s.Matr Nr 28106 25403 s.Name Carnap Jonas 2137 Kant 2137 2 27550 2136 Curie Ø Ø Ø Ø Ø … … … … … … … Datenbanken, SS 12 Kapitel 2: SQL Anfragen 27550 Schopenhauer 22 Outer Joins: Right Outer Join SELECT p.PersNr, p.Name, f.PersNr, f.Note, f.MatrNr, s.MatrNr, s.Name FROM Professoren p RIGHT OUTER JOIN (prüfen f RIGHT OUTER JOIN Studenten s ON f.MatrNr = p.MatrNr) ON p.PersNr = f.PersNr ; p.PersN r p.Name f.PersNr f.Note f.MatrN r s.MatrNr s.Name 2126 Russel 2126 1 28106 28106 Carnap 2125 Sokrates 2125 2 25403 25403 Jonas 2137 Kant 2137 2 27550 27550 Schopenhau er Ø Ø Ø Ø Ø 26120 Fichte … … … … … … … Datenbanken, SS 12 Kapitel 2: SQL Anfragen 23 Outer Joins: Full Outer Join SELECT p.PersNr, p.Name, f.PersNr, f.Note, f.MatrNr, s.MatrNr, s.Name FROM Professoren p FULL OUTER JOIN (prüfen f FULL OUTER JOIN Studenten s ON f.MatrNr = s.MatrNr) ON p.PersNr = f.PersNr ; p.PersN r 2126 p.Name f.PersNr f.Note f.MatrNr s.MatrNr s.Name Russel Sokrate s 2126 1 28106 28106 Carnap 2125 2 25403 25403 Jonas 2137 Kant 2137 2 27550 27550 Schopenhauer Ø Ø Ø Ø Ø 26120 Fichte … … … … … … … 2136 Curie Ø Ø Ø Ø Ø … … … … … … … 2125 Datenbanken, SS 12 Kapitel 2: SQL Anfragen 24 Outer Joins: Oracle-Syntax Anfrage: welche Studenten hören welche Vorlesungen SELECT * FROM Studenten LEFT OUTER JOIN hören USING (MatrNr) SELECT * FROM Studenten s, hören h WHERE s.MatrNr = h.MatrNr (+) Datenbanken, SS 12 Kapitel 2: SQL Anfragen 25 Äußere Joins select p.PersNr, p.Name, f.PersNr, f.Note, f.MatrNr, s.MatrNr, s.Name from Professoren p left outer join (prüfen f left outer join Studenten s on f.MatrNr= s.MatrNr) on p.PersNr=f.PersNr; PersNr p.Name f.PersNr 2126 Russel 2126 2125 Sokrates 2125 2137 Kant 2137 2136 Curie - f.Note 1 2 2 - f.MatrNr s.MatrNr s.Name 28106 28106 Carnap 25403 25403 Jonas 27550 27550 Schopenhauer - Äußere Joins select p.PersNr, p.Name, f.PersNr, f.Note, f.MatrNr, s.MatrNr, s.Name from Professoren p right outer join (prüfen f right outer join Studenten s on f.MatrNr= s.MatrNr) on p.PersNr=f.PersNr; PersNr p.Name f.PersNr f.Note f.MatrNr s.MatrNr s.Name 2126 Russel 2126 1 28106 28106 Carnap 2125 Sokrates 2125 2 25403 25403 Jonas 2137 Kant 2137 2 27550 27550 Schopenhauer 26120 Fichte Äußere Joins select p.PersNr, p.Name, f.PersNr, f.Note, f.MatrNr, s.MatrNr, s.Name from Professoren p full outer join (prüfen f full outer join Studenten s on f.MatrNr= s.MatrNr) on p.PersNr=f.PersNr; p.PersNr p.Name f.PersNr 2126 Russel 2126 2125 Sokrates 2125 2137 Kant 2137 f.Note 1 2 2 - - - - 2136 Curie - - f.MatrNr s.MatrNr s.Name 28106 28106 Carnap 25403 25403 Jonas 27550 27550 Schopenhauer 26120 Fichte - - - Rekursion select Vorgänger from voraussetzen, Vorlesungen where Nachfolger= VorlNr and Titel= `Der Wiener Kreis´ Der Wiener Kreis Wissenschaftstheorie Erkenntnistheorie Bioethik Ethik Grundzüge Mäeutik Rekursion select v1.Vorgänger from voraussetzen v1, voraussetzen v2, Vorlesungen v where v1.Nachfolger= v2.Vorgänger and v2.Nachfolger= v.VorlNr and v.Titel=`Der Wiener Kreis´ Vorgänger des „Wiener Kreises“ der Tiefe n select v1.Vorgänger Wollen wir das wirklich? from voraussetzen v1 voraussetzen vn_minus_1 voraussetzen vn, Vorlesungen v where v1.Nachfolger= v2.Vorgänger and vn_minus_1.Nachfolger= vn.Vorgänger and vn.Nachfolger = v.VorlNr and v.Titel= `Der Wiener Kreis´ Grundproblem: Transitive Hülle transA,B(R)= {(a,b) k IN (1, ..., k R ( 1.A= 2.B k-1.A= k.B 1.A= a k.B= b))} Der Wiener Kreis Wissenschaftstheorie Erkenntnistheorie Bioethik Ethik Grundzüge Mäeutik Die connect by-Klausel (Oracle) select Titel from Vorlesungen where VorlNr in (select Vorgänger Grundzüge Ethik Erkenntnistheorie Wissenschaftstheorie from voraussetzen connect by Nachfolger=prior Vorgänger start with Nachfolger= (select VorlNr from Vorlesungen where Titel= `Der Wiener Kreis´)); Rekursion in DB2/SQL99: gleiche Anfrage with TransVorl (Vorg, Nachf) as (select Vorgänger, Nachfolger from voraussetzen union all select t.Vorg, v.Nachfolger from TransVorl t, voraussetzen v where t.Nachf= v.Vorgänger) select Titel from Vorlesungen where VorlNr in (select Vorg from TransVorl where Nachf in (select VorlNr from Vorlesungen where Titel= `Der Wiener Kreis´) ) zuerst wird eine temporäre Sicht TransVorl mit der withKlausel angelegt Diese Sicht TransVorl ist rekursiv definiert, da sie selbst in der Definition vorkommt Aus dieser Sicht werden dann die gewünschten Tupel extrahiert Ergebnis ist natürlich wie gehabt Fazit Rekursion/transitive Hülle In SQL nur mühsam lösbar Vorhandene Lösungen sind technologieabhängig Die praktisch beste Lösung ist fast immer das Ändern der Datenstruktur oder das Anlegen von Hilfstabellen voraussetzen_rec 5001 5216 Vorgänger Nachfolger 5001 5052 5001 5041 5001 5043 5001 5043 5001 5052 5001 5049 5043 5041 5216 5041 5043 5052 5041 5052 5052 5259 Datenbanken, SS 12 Kapitel 2: SQL Anfragen Achtung! 5259 Solche Datenstrukturen 5259 sind oft schwer aktuell zu halten -> Datenintegrität 39 Syntaktische Beschreibung einer Select Anweisung "Grobsyntax": select_block { { UNION | INTERSECT | EXCEPT } [ALL] select_block ...} [ORDER BY result_column [ASC | DESC] {, result_column [ASC | DESC] …} mit select_block ::= SELECT [ALL | DISTINCT] {column | {expression [AS result_column]}} {, {column | {expression [AS result_column]}} …} FROM table [correlation_var] {, table [correlation_var] …} [WHERE search_condition] [GROUP BY column {, column …} [HAVING search_condition] ] Datenbanken, SS 12 Kapitel 2: SQL Anfragen 40 Typische Select-Pattern Paare von gleichartigen Objekten (z.B. Welche Paare von Studenten haben …?) SELECT a1.name, a2.name FROM a a1, a a2 WHERE a1.ID < a2.ID AND …. Verhindert, dass Paare zweimal vorkommen Aggregation (z.B. Wer hört wie viele Vorlesungen?) SELECT a.name, aggr(b.ID) FROM a,b WHERE a.ID=b.Fkey GROUP BY a.name Choosing group (z.B. Wer hört mehr als zwei Vorlesungen?) SELECT a.name FROM a,b WHERE a.ID=b.Fkey GROUP BY a.name HAVING … Datenbanken, WS 12/13 Kapitel 5: SQL2 41 Doppelte Aggregation Double aggregation ( z.B. Wie viele Vorlesungen hören Studenten im Durchschnitt?) Warum doppelt? Ich muss erst die Vorlesungen zählen und dann den Durchschnitt bestimmen. Einfachste Variante: SELECT aggr1(aggr2(b.ID)) a,b WHERE a.ID=b.Fkey Leider nicht FROM durch den GROUP BY a.ID Standard vorgesehen!!! System unabhängig: SELECT aggr1(t.temp) FROM (SELECT aggr2 AS temp FROM a,b WHERE a.ID=b.Fkey GROUP BY a.ID) t Datenbanken, WS 12/13 Kapitel 5: SQL2 42 Choice-by-aggregate (z.B. Welche Vorlesungen haben die meisten SWS?) SELECT a.name, x FROM a WHERE x = ( SELECT aggr(x) FROM a) Allerdings müssen beide a exakt identisch sein (inkl. WHERE, GROUP BY und HAVING Klauseln), sonst kann es zu einem Mismatch kommen. Bei komplexen a kann es sich daher lohnen eine View anzulegen (Kap. 8) Datenbanken, WS 12/13 Kapitel 5: SQL2 43 Constraints and Views... ..to be continued. Datenbanken, WS 12/13 Kapitel 5: SQL2 44