SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 Vorlesung #8 SQL (Teil 3) SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 „Fahrplan“ Besprechung der Übungsaufgaben Rekursion Rekursion in SQL-92 Rekursion in DBMS-“Dialekten“ (Oracle und DB2) Views (Sichten) - gespeicherte Abfragen Gewährleistung der logischen Datenunabhängigkeit Modellierung von Generalisierung UPDATE-fähige Sichten Datenintegrität Statische und dynamische Bedingungen Referentielle Integrität (primary key, foreign key) Propagieren der Primärschlüsselveränderungen (cascade) Ausblick Vorlesung #9, SQL Teil 4 © Bojan Milijaš, 05.05.2004 Vorlesung #8 - SQL (Teil 3) 2 SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 Rekursion Rekursive Relation voraussetzen in UNI Schema voraussetzen : {[Vorgänger, Nachfolger]} „Welche Vorlesungen muss man hören, um die Vorlesung „Der Wiener Kreis“ zu verstehen? SELECT Vorgaenger FROM voraussetzen vs, Vorlesungen vo WHERE vs.Nachfolger = vo.VorlNr AND vo.Titel = 'Der Wiener Kreis' ; © Bojan Milijaš, 05.05.2004 Vorlesung #8 - SQL (Teil 3) 3 SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 Rekursion (2) Das sind aber nur die direkten Vorgänger, bzw. Vorgänger erster Stufe! Wie bekommt man alle? Zunächst Vorgänger zweiter Stufe: SELECT Vorgaenger FROM voraussetzen WHERE Nachfolger IN (SELECT Vorgaenger FROM voraussetzen, Vorlesungen WHERE Nachfolger = VorlNr AND Titel = 'Der Wiener Kreis'); © Bojan Milijaš, 05.05.2004 Vorlesung #8 - SQL (Teil 3) 4 SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 Rekursion (3) SELECT Vogänger FROM voraussetzen WHERE Nachfolger IN (SELECT Vorgänger FROM voraussetzen, Vorlesungen WHERE Nachfolger = VorlNr AND Titel = `Der Wiener Kreis´); Entschachtelung SELECT v1.Vogä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´; © Bojan Milijaš, 05.05.2004 Vorlesung #8 - SQL (Teil 3) 5 SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 Rekursion (4) Man kann die gewonenne entschachtelte Abfrage verallgemeinern für die Vorgänger n-ten Stufe SELECT v1.Vogänger FROM voraussetzen v1, ..., voraussetzen v_n-1, voraussetzen vn, Vorlesungen v WHERE v1.Nachfolger = v2.Vorgänger AND ... AND v_n-1.Nachfolger, vn.Vorgänger AND vn.Nachfolger = v.Vorgänger AND v.Titel = `Der Wiener Kreis´; © Bojan Milijaš, 05.05.2004 Vorlesung #8 - SQL (Teil 3) 6 SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 Rekursion (5) (-) sehr umständlich zu formulieren (-) ineffizient bei der Durchführung (-) leider in SQL-Standard nicht anders möglich SQL ist nicht Turing-vollständig, SQL ist deklarativ, keine Schleifen, keine Kontrollverzweigungen, keine GO TO, JUMP Befehle oder ähnliches Das Finden aller Vorgänger nennt man allgemein „Berechnen der transitiver Hülle“ © Bojan Milijaš, 05.05.2004 Vorlesung #8 - SQL (Teil 3) 7 Rekursion (6) – Transitive Hülle voraussetzen SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 Der Wiener Kreis Wissenschaftstheorie Erkenntnistheorie Bioethik Ethik Mäeutik Grundzüge © Bojan Milijaš, 05.05.2004 Vorlesung #8 - SQL (Teil 3) 8 Rekursion (7) – Transitive Hülle SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 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))} © Bojan Milijaš, 05.05.2004 Vorlesung #8 - SQL (Teil 3) 9 Rekursion (8) – Oracle CONNECT BY Konstrukt SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 select Titel from Vorlesungen where VorlNr in (select Vorgaenger from voraussetzen CONNECT BY Nachfolger = PRIOR Vorgaenger START WITH Nachfolger = (select VorlNr from Vorlesungen where Titel= 'Der Wiener Kreis')); © Bojan Milijaš, 05.05.2004 Vorlesung #8 - SQL (Teil 3) 10 Rekursion (9) in IBM DB2 SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 with TransVorl (Vorg, Nachf) as (select Vorgaenger, Nachfolger from voraussetzen union all select t.Vorg, v.Nachfolger from TransVorl t, voraussetzen v where t.Nachf= v.Vorgaenger) select Titel from Vorlesungen where VorlNr in (select Vorg from TransVorl where Nachf in (select VorlNr from Vorlesungen where Titel= 'Der Wiener Kreis') ); © Bojan Milijaš, 05.05.2004 Vorlesung #8 - SQL (Teil 3) 11 SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 Sichten (VIEWs) „Aussenstehende“ – d.h. Datenbank-Benutzer wollen wissen, welcher Professor welche Vorlesungen liest? Benutzer wissen nichts von Schlüsseln (künstliche IDs), JOINs, verschiedenen Tabellen usw. CREATE VIEW ProfVorlesung AS SELECT Name, Titel FROM Professoren, Vorlesungen WHERE PersNr = gelesenVon; © Bojan Milijaš, 05.05.2004 Vorlesung #8 - SQL (Teil 3) 12 SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 Sichten (2) SELECT * FROM ProfVorlesung; NAME TITEL Kant Grundzuege ... ... (+) Wir zeigen den Benutzern genau das, was Sie sehen wollen Benutzerfreundlichkeit (+) Wir können die Informationen verbergen, die Benutzer nicht sehen wollen oder nicht sehen dürfen Datenschutz und Sicherheit (+) Wir können darunterliegende Basis-Tabellen verändern. Solange die Sichten angepasst werden, merken die Benutzer nichts logische Datenunabhängigkeit © Bojan Milijaš, 05.05.2004 Vorlesung #8 - SQL (Teil 3) 13 SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 Sichten (3) - logische Datenunabhängigkeit Benutzer 1 Benutzer 2 Sicht 1 Sicht 2 Sicht 3 Relation 1 Relation 2 Relation 3 Logische Datenunabhängigkeit Physische Datenunabhängigkeit © Bojan Milijaš, 05.05.2004 Vorlesung #8 - SQL (Teil 3) 14 Sichten (4) – Beispiel logische Datenunabhängigkeit Studenten SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 Internet-Besucher CREATE VIEW ProfVorlesung CREATE VIEW ProfVorlesung AS AS SELECT Name, Titel ProfVerlesung FROM Dozenten SELECT Name, Titel NATURAL JOIN lesen FROM Professoren, Vorlesungen NATURAL JOIN Kurse; WHERE PersNr = gelesenVon; Professoren Vorlesungen lesen Kurse Dozenten © Bojan Milijaš, 05.05.2004 Vorlesung #8 - SQL (Teil 3) 15 Sichten (5) – Modellierung der Generalisierungen SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 Im relationalen Modell lassen sich Inklusion und Vererbung nicht elegant modellieren Angestellte : {[PersNr,Name]} Professoren: {[PersNr,Rang,Raum]} Assistenten: {[PersNr,Fachgebiet,Boss]} Wenn man die Relationen eins zu eins in eine SQL Datenbank umsetzt, muss man sehr oft explizit „joinen“, z.B. jedes Mal, wenn man den Namen (oder nach dem Namen) eines Professors oder eines Assistenten sucht. © Bojan Milijaš, 05.05.2004 Vorlesung #8 - SQL (Teil 3) 16 Sichten (6) – Untertyp als Sicht create table Angestellte (PersNr integer not null, Name varchar (30) not null); SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 create view Professoren as select * from Angestellte a, ProfDaten d create table ProfDaten (PersNr integer not null, Rang character(2), Raum integer); where a.PersNr=d.PersNr; create view Assistenten as create table AssiDaten (PersNr integer not null, Fachgebiet varchar(30), Boss integer); © Bojan Milijaš, 05.05.2004 select * from Angestellte a, AssiDaten d where a.PersNr=d.PersNr; Vorlesung #8 - SQL (Teil 3) 17 Sichten (7) – Obertyp als Sicht create table Professoren (PersNr integer, Name varchar (30), Rang character (2), Raum integer); create table Assistenten (PersNr integer, Name varchar (30), Fachgebiet varchar (30), Boss integer); © Bojan Milijaš, 05.05.2004 SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 create view Angestellte as (select PersNr, Name from Professoren) union (select PersNr, Name from Assistenten); Vorlesung #8 - SQL (Teil 3) 18 Sichten (8) – Modellierung der Generalisierungen SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 Sowohl Untertypen als auch Obertypen kann man als Sichten modellieren Erste Alternative: Obertyp(en) als Sicht(en), Untertyp(en) als Tabelle(n) Zweite Alternative: Obertyp(en) als Tabelle(n), Untertyp(en) als Sicht(en) Man spart sich bei den Zugriffen zusätzliche Joins, aber es entstehen Probleme beim Ändern oder Hinzufügen der Daten, da Sichten i.a. nicht veränderbar sind Die Zugriffe auf Tabellen sind i.a. Schneller und hinsichtlich der Datenänderungen unproblematisch, so dass man die Sichten für „unwichtigere“ Entities nimmt © Bojan Milijaš, 05.05.2004 Vorlesung #8 - SQL (Teil 3) 19 Sichten (9) – UPDATE-Fähigkeit SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 Sichten sind immer veränderbar im Bezug auf DDLOperation, hier ist aber DML gemeint! Sichten sind i.a. nicht UPDATE fähig, da das DBMS bei einer UPDATE, DELETE oder INSERT Operation auf einer Sicht nicht weiß, welche Basis-Tabelle wie zu verändern ist: wenn Sichten Duplikatelimierung und Aggregatfunktionen (DISTINCT, GROUP BY usw.) beinhalten wenn der Schlüssel der zugrundeliegenden Tabelle(n) nicht enthalten ist Wenn durch das INSERT, UPDATE oder DELETE Statement mehr als eine Tabelle referenziert wird © Bojan Milijaš, 05.05.2004 Vorlesung #8 - SQL (Teil 3) 20 Sichten (10) – UPDATE-Fähigkeit SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 Beispiel einer nicht UPDATABLE View: create view WieHartAlsPrüfer (PersNr, Durchschnittsnote) as select PersNr, avg(Note) from prüfen group by PersNr; alle Sichten theoretisch änderbare Sichten in SQL änderbare Sichten © Bojan Milijaš, 05.05.2004 Vorlesung #8 - SQL (Teil 3) 21 SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 Datenintegrität Integitätsbedingungen bis jetzt Schlüssel Eindeutigkeit Beziehungskardinalitäten (min,max Notation) Attributdomänen (NUMBER, CHAR, DATE) Inklusion bei Generalisierung (Untertyp immer im Obertyp enthalten) statische Integritätsbedingungen Bedingungen an den Zustand der Datenbasis Mit Datenbank-CONSTRAINTs realisiert dynamische Integritätsbedingungen Bedingungen an Zustandsübergänge Mit Datenbank-TRIGGERn realisiert * engl. CONSTRAINT = Bedingung, TRIGGER = Auslöser © Bojan Milijaš, 05.05.2004 Vorlesung #8 - SQL (Teil 3) 22 Statische CONSTRAINTs SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 NOT NULL UNIQUE CHECK (Regel) Vorisicht: CHECK ist auch dann erfüllt, wenn der logische Vergleich einen NULL-Wert zurückliefert CREATE TABLE MyProfessoren ( PersNr NUMBER(5,0) UNIQUE, Name VARCHAR2(30) NOT NULL, Rang CHAR(2) CHECK (Rang IN ('C1', 'C2', 'C3','C4') ) ); © Bojan Milijaš, 05.05.2004 Vorlesung #8 - SQL (Teil 3) 23 Statische CONSTRAINTs (2) SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 Man kann CONSTRAINTs nachträglich definieren ALTER TABLE myprofessoren ADD CHECK (Rang IN ('C1', 'C2', 'C3','C4') ); löschen, verändern, suchen, auflisten, ein- und ausschalten, validieren (siehe SQL-Manual des jeweiligen DBMS, hier Oracle Syntax für das Löschen) ALTER TABLE myprofessoren DROP CONSTRAINT sys_c003798; Dynamische Constraints mit Triggern nächstes Mal (Vorlesung #9) © Bojan Milijaš, 05.05.2004 Vorlesung #8 - SQL (Teil 3) 24 Referentielle Integrität SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 Sorgt dafür, dass die Beziehung zwischen dem Primärschlüssel und dem Fremdschlüssel bestehen bleibt (dass die Referenz - der Verweis - erhalten bleibt) Fremdschlüssel müssen auf existierende Tupel verweisen oder einen Nullwert enthalten Beispiel gelesenVon PersNr CREATE TABLE Professoren (PersNr INTEGER PRIMARY KEY ...) (CREATE TABLE Vorlesungen gelesenVon INTEGER REFERENCES Professoren ...) © Bojan Milijaš, 05.05.2004 Vorlesung #8 - SQL (Teil 3) 25 Referentielle Integrität (2) SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 Schlüsselkandidat UNIQUE CONSTRAINT Primärschlüssel PRIMARY KEY Fremdschlüssel FOREIGN KEY (auch implizit durch das Wort REFERENCES in TabellenDefinition) FOREIGN KEYs können auch NULL Werte enthalten UNIQUE FOREIGN KEY modelliert 1:1 Beziehung © Bojan Milijaš, 05.05.2004 Vorlesung #8 - SQL (Teil 3) 26 Einhaltung referentieller Integrität Änderung von referenzierten Daten Default: Zurückweisen der Änderungsoperation Propagieren der Änderungen: cascade Verweise auf Nullwert setzen: set null Dies ergibt folgende Möglichkeiten bei der Festlegung des CONSTRAINTs in der TabellenDefinition SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 ON [ UPDATE | DELETE ] [ SET NULL | CASCADE ] Kaskadierendes Löschen mit Vorsicht geniessen! Beispiel: wenn in „Vorlesungen“ und „hören“ kaskadierend gelöscht wird, verliert man die beim Löschen eines Professors die Information welcher Student was gehört hat. © Bojan Milijaš, 05.05.2004 Vorlesung #8 - SQL (Teil 3) 27 UNI Schema mit Constraints SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 Kemper Seite 157 In der Vorlesung verteilt © Bojan Milijaš, 05.05.2004 Vorlesung #8 - SQL (Teil 3) 28 SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 Fazit und Ausblick Fazit SQL Teil 1 bis 3 SQL Teil 1 – Datentypen, einfache Abfragen SQL Teil 2 – komplexe Abfragen, Unterabfragen SQL Teil 3 – Rekursion, Views, Constraints Ausblick SQL Teil 4 Trigger Prozedurale Erweiterungen (PL/SQL) Einbettung in C,C++,Java SQL Schnittstellen JDBC,ODBC Query By Example QBE © Bojan Milijaš, 05.05.2004 Vorlesung #8 - SQL (Teil 3) 29 SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 Vorlesung #8 Ende