3 SQL – Structured Query Language 3.1 Überblick I SQL (früherer Name: SEQUEL): Zunächst Abfragesprache des relationalen DBMS-Prototyps System R“, Impl. ab Anf. 70er Jahre im IBM Forschungslabor in San Jose, CA. ” I Sprachimplementierung unterstützte (mit derselben Sprache!) von Anfang an zwei Schnittstellen: Interaktive Bildschirmschnittstelle: User Friendly Interface (UFI)“ ” Anwendungsprogramm-Schnittstelle: Embedded SQL“ ” I SQL wurde ab Anfang der 80er Jahre in verschiedenen DB-Implementierungen verfügbar: IBM (DB2,. . .), DEC (RDB), Oracle, Ingres, Informix, MS Access, MS SQL-Server, . . . I Anfang/Mitte der 80er Jahre Standardisierungsaktivitäten am ANSI für eine relationale DBSprache auf Basis von SQL I 1987 wird SQL ISO-Standard (ISO 9075) und anschließend auch als deutsche Norm DIN-ISO 9075 übernommen. I 1989 Erweiterung von ISO 9075 (DIN-ISO 9075 folgte 1990), u.a. um Regeln für die Unterstützung referentieller Integrität (referential integrity) I 1992 Verabschiedung von SQL2“ als ISO 9075-1992, und 1993 als DIN 66315 ” I Ende 1999 Verabschiedung von SQL-3“ ” c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-1 I Unterschiede zwischen SQL und den Konzepten aus Kapitel 2: SQL-Relationen sind i.a. nicht duplikatfrei (Multimengen) Duplikatfreiheit kann in Basisrelationen durch Integritätsbedingungen erzwungen werden. Bei Anfrage-Resultaten müssen i.d.R. – wo gewünscht – explizit (per Operator) Duplikate entfernt werden. SQL-Anfragen: . bilden die Relationenalgebra weitgehend ab. . Grenzen bei der Orthogonalität . enthalten zusätzlich Aggregationsfunktionen, Gruppierung, Sortierung, spezielle Operationen für einige Datentypen SQL bietet zusätzlich: . DML: Manipulation (Updates) von Relationen (INSERT, UPDATE, DELETE) . DDL: Definition von Tabellen, Indizes, etc. . Verwaltung von Benutzern, Autorisierung I In den meisten kommerziellen DBMSen gibt es (z.T. große) Abweichungen vom SQL-Standard (der SQL-92-Standard enthält deswegen 3 Levels“) ” I Nächster/Aktueller Standard: SQL-3“, u.a. zusätzliche Funktionalität für ” Objekte Multimedia-Daten (→ Erweiterung) Zeitdaten rekursive Anfragen . . . verabschiedet Ende 1999. Hier noch weitgehend SQL-2 c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-2 3.2 Anfragen I Basisbaustein: Select-From-Where-Block (SFW-Block) Syntaktische Grundstruktur (vereinfacht): » ff– [ALL] SELECT Attributliste FROM R1, . . . , Rn [ WHERE Prädikat ] DISTINCT » » ff– » » ff– –– ASC ASC ORDER BY Attr1∗) , Attr2∗) , ... DESC DESC ∗) Anstelle des Attributnamens kann auch die Attributnummer (= Attributposition) angegeben werden. Bedeutung SFW: πAttributliste (σPrädikat (R × · · · × Rn ) | 1 {z } Produkt! Dabei ist . ALL/DISTINCT. . . Kennzeichnung für mit/ohne Duplikate [Im folgenden der Einfachheit halber meist ohne DISTINCT“!] ” . Attributliste . . . von der Form Ri .Aij , . . .“ ” oder Ri .∗“ oder ∗“ (= alle Attribute) ” ” . Prädikat . . . Attribute (Ri .Aij ), Konstanten, =, 6=, <, . . ., AND, OR, NOT, u.v.m. c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-3 Anmerkungen/Hinweise: . SELECT – Klausel ist Projektion (nicht Selektion) . (gedankliche) Reihenfolge der Anwendung FROM→WHERE→SELECT I Im folgenden schrittweise Erläuterung anhand von Beispielen 3.2.1 S1. Ein-Tabellen-Operationen (Selektion/Projektion) Gib die Teilnehmer-Relation komplett aus.“ ” SELECT [ DISTINCT ] * FROM Teilnehmer Hinweis: Die WHERE-Klausel entfällt in diesem Fall, da keine einschränkende Selektionsbedingung zu spezifizieren ist. S2. Gib die Teilnehmer-Relation komplett aus, aber in der Attribut-Reihenfolge Name, TnNr, Ort.“ ” SELECT Name, TnNr, Ort FROM Teilnehmer c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-4 S3. Gib alle Kursteilnehmer aus, die aus ‘Ulm’ kommen.“ ” mit expliziter Attributangabe mittels Kurzform SELECT TNNr, Name, Ort FROM Teilnehmer WHERE Ort = ‘Ulm’ SELECT ∗ FROM Teilnehmer WHERE Ort = ‘Ulm’ I SQL enthält auch zusätzliche Operatoren für bestimmte Datentypen: Verwendung von arithmetischen Funktionen in der SELECT-Klausel IN-Prädikat für Vergleiche mit einer Menge von Konstanten LIKE-Vergleichsoperator für CHAR-Attribute ORDER BY zur Sortierung (auf- oder absteigend, auch mehrere Attribute) DATE-Datentyp für Datum und Zeit c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-5 3.2.2 Mehr-Tabellen-Operationen, Verbunde (Joins) I Syntaktische Grundstruktur (vereinfacht): SELECT Attributliste FROM Rel 1, Rel 2,. . . Rel n WHERE Rel i .Attributname = Rel j .Attributname AND Rel k .Attributname = Rel l .Attributname AND. . . AND Rel y .Attributname = Rel z .Attributname mit i , j, k, l, . . . , z ∈ {1, 2, . . . n} Anmerkungen: . In dieser Formulierung werden Joins als Produkte gefolgt von Selektionen ausgedrückt! . Es sind auch andere Vergleichsoperatoren zugelassen. . SQL 2 sieht explizite Join-Operationen vor (s. später) c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-6 S4. Gib aus, welche Kursangebote (Ausgabe: KursNr, AngNr) von welchen Kursleitern (Ausgabe: ” Name) durchgeführt werden.“ SELECT f.KursNr, f.AngNr, lt.Name FROM Fuehrt durch f, Kursleiter lt WHERE f.PersNr = lt.PersNr KursNr G08 G08 G10 G10 P13 P13 I09 I09 I09 AngNr 1 2 1 2 1 2 1 2 3 Name Huber,L. Huber,L. Müller,K. Schulze,H. Meier,I. Meier,I. Schulze,H. Schulze,H. Schulze,H. c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-7 S5. Wie S4, aber zusätzlich sollen noch der Kurstitel, das Kursdatum und der Kursort ausgeben ” werden.“ SELECT f.KursNr, f.AngNr, lt.Name, k.Titel, a.Datum, a.Ort FROM Fuehrt durch f, Kursleiter lt, Kurs k, Angebot a WHERE f.PersNr = lt.PersNr AND f.KursNr = a.KursNr AND f.AngNr = a.AngNr AND f.KursNr = k.KursNr KursNr G08 G08 G10 G10 P13 P13 I09 I09 I09 AngNr 1 2 1 2 1 2 1 2 3 Name Huber,L. Huber,L. Müller,K. Schulze,H. Meier,I. Meier,I. Schulze,H. Schulze,H. Schulze,H. Titel Grundlagen I Grundlagen I Grundlagen II Grundlagen II C-Programmierung C-Programmierung Datenbanken Datenbanken Datenbanken c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language Datum 13 − 01−1996 24 − 02−1996 01 − 02−1996 15 − 02−1996 28 − 05−1996 01 − 07−1996 27 − 03−1996 23 − 04−1996 29 − 05−1996 Ort München Bremen München Hamburg Ulm Essen Stuttgart Hamburg München 3-8 S6. Gib aus, welche Teilnehmer (Ausgabe: TnNr, Name) an Kurs ‘G08’ oder ‘G10’ (Ausgabe: ” KursNr, AngNr) teilnehmen.“ SQL-Formulierung: I In SQL-92 sind die Möglichkeiten zur Formulierung von Joins wesentlich verbessert worden, da diese direkt in der FROM-Klausel ausgedrückt werden können (und somit die WHERE-Klausel vereinfachen). Möglichkeiten: NATURAL JOIN UNION JOIN CROSS JOIN Condition Join Column Name Join OUTER JOIN I Dies ist zur Zeit noch nicht in allen RDBMSen realisiert worden. c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-9 3.2.3 Subqueries / Existenzbedingungen I Form 1: SELECT Attributliste FROM Rel 1, Rel 2,. . . , Rel n WHERE [ NOT ] EXISTS (SELECT-FROM-WHERE-Ausdruck) I Form 2: SELECT Attributliste FROM Rel 1, Rel 2,. . . , Rel n WHERE R i .Attr name (R i .Attr name, R j .Attr name, . . . ) 8 < 9 > <= > > » > ff > ff– < > = ANY = <> > > > > > : >= > ; > ALL (SELECT-FROM-WHERE-Ausdruck) I Form 3: SELECT Attributliste FROM Rel 1, Rel 2,. . . , Rel n R i .Attr name WHERE (R .Attr name, R .Attr name, . . . ) i j ff [ NOT ] IN (SELECT-FROM-WHERE-Ausdruck) c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-10 I Anmerkungen: Anfrageform 1: Der Subquery-Ausdruck (EXISTS) liefert nur TRUE (Treffer gefunden) oder FALSE (keine Treffer). Anfrageform 2: Ohne ANY-/ALL-Zusatz muss der Subquery-Ausdruck so formuliert sein, dass genau ein Attributwert oder Tupel (keine Menge!) zurückgeliefert wird. Dieser wird als Vergleichswert ( Quasi-Konstante“) im äußeren (Sub-)Query-Ausdruck verwendet.1 ” = ANY ist äquivalent zu IN, NOT IN ist äquivalent zu <> ALL. Subquery-Ausdrücke können geschachtelt sein, d.h. sie können wiederum Subquery-Ausdrücke enthalten. In Subquery-Ausdrücken kann auf Relationen von äußeren (Sub-)Query-Ausdrücken Bezug ge- nommen werden: =⇒ korrelierte Subqueries (correlated subqueries) Subqueries liefern (Ausnahme: Form 1) per Default ebenfalls Multimengen als Resultat zurück. Ggf. muss dies mittels SELECT DISTINCT verhindert werden. Je nach Anfragebearbeitungs-Strategie bzw. Güte der Anfrage-Optimierung des verwendeten DBMS können sich bei semantisch äquivalenten Anfrageformulierungen im konkreten Fall stark unterschiedliche Antwortzeiten ergeben.2 1 Die Klammer in (R .Attr name, R .Attr name, . . .) fungiert als Tupel-Konstruktor. Dieser wurde erst mit SQL-2 eingeführt. i j Er wurde aber von einigen DBMSen (z.B. ORACLE) bereits schon vorher unterstützt. 2 Eine ausführliche Behandlung dieses Aspektes findet sich – neben anderen Dingen – z.B. in: (Rautenstrauch und Moazzami 1990) c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-11 S7. Gib alle Kursangebote aus (Ausgabe: KursNr, AngNr), für die Teilnehmer aus ‘Ulm’ gebucht ” haben.“ Möglichkeit 1: Join (wie gehabt) I In Algebra-Notation: π Nimmt-teil.KursNr, Nimmt-teil.AngNr (Nimmt-teil 1 σ Ort=‘Ulm’Teilnehmer) I In SQL-Notation: SELECT DISTINCT nt.KursNr, nt.AngNr FROM Nimmt teil nt, Teilnehmer t WHERE nt.TnNr = t.TnNr AND t.Ort = ‘Ulm’ KursNr I09 P13 AngNr 1 1 Möglichkeit 2: (korrelierte) Subquery mit EXISTS SELECT DISTINCT nt.KursNr, nt.AngNr FROM Nimmt teil nt WHERE EXISTS (SELECT * FROM Teilnehmer t WHERE t.Ort = ‘Ulm’ AND t.TnNr = nt.TnNr) c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-12 Möglichkeit 3: Subquery mit ANY SELECT DISTINCT nt.Kursnr, nt.AngNr FROM Nimmt teil nt WHERE nt.TnNr = ANY (SELECT TnNr FROM Teilnehmer WHERE Ort = ‘Ulm’) Möglichkeit 4: Subquery mit IN SELECT DISTINCT nt.KursNr, nt.AngNr FROM Nimmt teil nt WHERE nt.TnNr IN (SELECT TnNr FROM Teilnehmer WHERE Ort = ‘Ulm’) Anmerkungen: I Bei der EXISTS-Variante handelt es sich um eine korrelierte Subquery, bei der ANY- und IN-Variante um nicht-korrelierte Subqueries. I Wir werden später eine alternative Formulierung zu der EXISTS-Formulierung mittels COUNT kennenlernen. c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-13 Resultat Resultat Startbedingung Haupt-Query HauptQuery HauptQuery Output Subquery SubQuery 1 mal n mal Input für Subquery Startbedingung Subquery nicht-korreliert Output Subquery n mal SubQuery korreliert Abbildung 3-1: Nicht-korrelierte und korrelierte Subqueries (schematische Darstellung) c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-14 S8. S9. Gib alle Kursangebote (Ausgabe: Angebot.*) aus, für die keine Anmeldungen vorliegen.“ ” Gib die Personalnummer des Kursleiters mit dem höchsten Gehalt aus.“ ” SELECT k1.PersNr FROM Kursleiter k1 WHERE NOT EXISTS (SELECT * FROM Kursleiter k2 WHERE k2.Gehalt > k1.Gehalt) Alternative Formulierung ALL-Quantor: c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-15 S10. Gib alle Kurse aus (Ausgabe: Angebot-Info), die Teilnehmer(in) ‘Schmidt, M.’ gebucht hat.“ ” Annahme hier: Die Teilnehmer-Namen seien eindeutig SELECT * FROM Angebot WHERE (AngNr, KursNr) IN (SELECT AngNr, KursNr FROM Nimmt teil WHERE TnNr = (SELECT TnNr FROM Teilnehmer WHERE Name = ‘Schmidt, M.’)) S11. Wie S10, aber es interessieren alle Kurse, die ‘Schmidt, M.’ oder ‘Abele, I.’ gebucht haben.“ SELECT * FROM Angebot WHERE (AngNr,KursNr) IN ( SELECT AngNr, KursNr FROM Nimmt_teil WHERE TnNr = .... ( SELECT TnNr ??? FROM Teilnehmer WHERE Name = 'Schmidt, M.' OR Menge! Name = 'Abele, I.' ) ) c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-16 3.2.4 Aggregat- und Gruppierungs-Funktionen I SQL bietet standardmäßig die folgenden eingebauten“ Mengen-Funktionen (set functions; ” built-in functions) an: Funktion COUNT(∗) COUNT([DISTINCT] Attributname ) MAX(Attributname) MIN(Attributname) AVG([DISTINCT] Attributname) SUM([DISTINCT] Attributname ) POSITION (string IN source string) SUBSTRING (src str FROM pos [FOR len]) UPPER(src str ) LOWER(src str ) 8 9 <BOTH = TRIM LEADING char FROM src str ) : ; TRAILING TRANSLATE, CONVERT CURRENT DATE CURRENT TIME[(precision)] CURRENT TIMESTAMP[(precision)] Bedeutung Anzahl der Tupel Anzahl der Attributwerte Maximum der Attributwerte Minimum der Attributwerte Durchschnitt der Attributwerte Summe der Attributwerte Suche Pos. von String in String Extraktion eines Substrings Umwandl. in Großbuchstaben Umwandl. in Kleinbuchstaben Entf. von führenden und/oder anhängenden Zeichen (∗) (∗) (∗) (∗) (∗) Beispiel: TRIM BOTH ’ ’ FROM ’ qaa ’ → ’qaa’ Zur Unterstützung verschied. Zeichensätze Liefert das aktuelle Datum3 Liefert die aktuelle Zeit mit precision Nachkommastellen3 Liefert aktuelle TIMESTAMP mit precision Nachkommastellen3 (∗) (∗) (∗) (∗) (∗) Erst in SQL 2 eingeführt, allerdings z.T. bereits in einigen DBMS unterstützt 3 Als Datentyp DATE bzw. TIMESTAMP c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-17 S12. Gib die Anzahl aller Kursteilnehmer aus.“ ” SELECT COUNT(*) FROM Teilnehmer S13. Gib die Anzahl aller Kursteilnehmer aus ‘Ulm’ aus.“ ” SELECT COUNT(*) FROM Teilnehmer WHERE Ort = ‘Ulm’ S14. Gib das durchschnittliche Gehalt aller Kursleiter aus.“ ” SELECT AVG(Gehalt) FROM Kursleiter Wichtiger Hinweis: Wenn eine SELECT-Anweisung eine Aggregatfunktion enthält, so wird nur max. ein Resultat-Tupel erzeugt. Ausnahme: Bei Verwendung der GROUP BY-Klausel (kommt später). c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-18 S15. Gib das höchste, das niedrigste und das durchschnittliche Kursleiter-Gehalt sowie die Summe ” aller Gehälter aus.“ SELECT MAX(Gehalt), MIN(Gehalt), AVG(Gehalt), SUM(Gehalt)4 FROM Kursleiter S16. Anfrage S9: Gib die Personalnummer des Kursleiters mit dem höchsten Gehalt aus.“ ” Mittels Aggregat-Funktion formuliert: SELECT PersNr FROM Kursleiter WHERE Gehalt >= (SELECT MAX(Gehalt) FROM Kursleiter) 4 Die Angabe mehrerer Aggregat-Funktionen in einem SELECT-Ausdruck wird möglicherweise nicht von allen DBMS unterstützt. Bei ORACLE ist dies zulässig. c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-19 S17. Gib die Anzahl der verschiedenen Orte aus, aus denen die Kursteilnehmer kommen.“ ” S18. Gib alle Kursangebote aus (Ausgabe: KursNr, AngNr), für die Teilnehmer aus ‘Ulm’ gebucht ” haben.“ (vgl. Anfrage S7): Mittels COUNT formuliert: SELECT nt.KursNr, nt.AngNr FROM Nimmt teil nt WHERE 0 < (SELECT COUNT(*) FROM Teilnehmer t WHERE t.Ort = ‘Ulm’ AND t.TnNr = nt.TnNr) c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-20 S19. Gib auf Basis der Teilnehmer-Relation eine ortsbezogene Teilnehmerstatistik aus (Ausgabe: ” Ortsname, Teilnehmerzahl).“ SELECT Ort, COUNT . . . ? FROM Teilnehmer Lösung: Gruppierung SELECT Ort, COUNT(Ort) FROM Teilnehmer GROUP BY Ort Ort Augsburg Bochum Bremen Essen Hamburg Heidelberg Senden Stuttgart Ulm COUNT(Ort) 1 1 1 1 1 1 1 2 2 c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-21 I Syntaktische Struktur: SELECT FROM [ WHERE [ GROUP BY [HAVING [ ORDER BY [ALL|DISTINCT] Attributliste Relationenliste Nebenbedingung] Gruppierungsattribut(e) Gruppierungsbedingung]] Attributliste] Erläuterung und ergänzende Kommentare: GROUP BY bewirkt (interne) Teilmengenbildung (Gruppierung) der Ergebnis-Relation entsprechend dem/den Gruppierungsattribut(en) (→ Menge von Mengen). Aggregationsfunktionen werden jeweils auf Teilmengen (falls vorhanden) angewandt. Eventuelle Joins werden vor Anwendung der Gruppierungsfunktion ausgeführt (gedankliche (!) Ausführungs-“reihenfolge jetzt also: ” FROM→WHERE→GROUP BY→HAVING→ORDER BY→SELECT) In der SELECT-Klausel können – bei Angabe von GROUP BY – neben Aggregat-Funktionen auch Gruppierungsattribute stehen. Gruppierungsnebenbedingungen werden mittels HAVING-Klausel ausgedrückt (HAVING kann nur in Verbindung mit GROUP BY auftreten). Beziehung WHERE↔HAVING: . WHERE eliminiert einzelne Zeilen . HAVING eliminiert einzelne Gruppen c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-22 Wirkungsweise von GROUP BY . . . unter Verwendung von nicht normalisierten“ oder geschachtelten“ Relationen kann man die ” ” Wirkung von GROUP BY einfach wie folgt erläutern: Nach der Auswertung der FROM- und WHERE-Klauseln wird das bisherige Zwischenergebnis nach den in der GROUP BY-Klausel angegebenen Attributen in geschachtelte Tupel“ gruppiert. ” Zwischenergebnis2 Zwischenergebnis1 A B {CD-Gruppe} A B C D C D a b c1 c2 a b c1 c2 a b c3 c4 → GROUP BY A,B → c3 c4 x y c3 c4 x y c3 c4 x y c5 c6 c5 c6 x y c7 c8 c7 c8 q w c9 c10 q w c9 c10 . . . aus den 6 Tupeln des ersten Zwischenergebnisses sind 3 Tupel des zweiten geworden, die jeweils eine Menge von CD-Tupeln als Attribut“ haben. Eine evtl. HAVING-Klausel ist eine Selektion in ” diesem relationenwertigen Attribut“. ” Offensichtlich sind Beschränkungen bzgl. nachfolgender Projektionen (SELECT-Klausel) erforderlich, damit das Ergebnis wieder eine flache“, d.h. normalisierte, Relation ist. ” c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-23 S20. Gib für alle Kursangebote die Anzahl der Anmeldungen aus (Ausgabe: Angebote-Attribute, ” Anzahl Teilnehmer).“ SELECT FROM WHERE GROUP BY AngNr 1 1 1 2 2 2 S21. KursNr G08 I09 P13 G08 I09 P13 a.*, COUNT(*) Angebot a, Nimmt teil nt a.AngNr = nt.AngNr AND a.KursNr = nt.KursNr a.AngNr, a.KursNr, a.Datum, a.Ort Datum 13 − 01−1996 27 − 03−1996 28 − 05−1996 24 − 02−1996 23 − 04−1996 01 − 07−1996 Ort München Stuttgart Ulm Bremen Hamburg Essen COUNT(*) 1 5 2 1 1 3 Wie S20, aber nur solche Kurse ausgeben, für die mehr als 2 Anmeldungen vorliegen.“ ” SELECT a.*, COUNT(*) FROM Angebot a, Nimmt teil nt WHERE a.AngNr = nt.AngNr AND a.KursNr = nt.KursNr GROUP BY a.AngNr, a.KursNr, a.Datum, a.Ort HAVING COUNT(*) > 2 AngNr 1 2 KursNr I09 P13 Datum 27 − 03−1996 01 − 07−1996 Ort Stuttgart Essen COUNT(*) 5 3 c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-24 S22. Gib alle Kursleiter aus, die mindestens zwei Kurse leiten. Ausgabe: Personaldaten, Angebots” daten, sortiert nach PersNr.“ SELECT kl.*, a.* FROM Angebot a, Kursleiter kl, Fuehrt durch fd WHERE a.AngNr = fd.AngNr AND a.KursNr = fd.KursNr AND fd.PersNr = kl.PersNr AND kl.PersNr IN (SELECT PersNr FROM Fuehrt durch GROUP BY PersNr HAVING COUNT(*) >= 2) ORDER BY kl.PersNr PersNr 27183 27183 29594 29594 29594 29594 38197 38197 Name Meier,I. Meier,I. Schulze,H. Schulze,H. Schulze,H. Schulze,H. Huber,L. Huber,L. AngNr 1 2 2 1 3 2 1 2 KursNr P13 P13 G10 I09 I09 I09 G08 G08 Datum 28 − 05−1996 01 − 07−1996 15 − 02−1996 27 − 03−1996 29 − 05−1996 23 − 04−1996 13 − 01−1996 24 − 02−1996 c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language Ort Ulm Essen Hamburg Stuttgart München Hamburg München Bremen 3-25 Alternative Query-Formulierung für S22 ohne GROUP BY: SELECT kl.*, a.* FROM Angebot a, Kursleiter kl, Fuehrt durch fd WHERE a.AngNr = fd.AngNr AND a.KursNr = fd.KursNr AND fd.PersNr = kl.PersNr AND 2 <= (SELECT COUNT(*) FROM Fuehrt durch fd1 WHERE fd1.PersNr = fd.PersNr) ORDER BY kl.PersNr S23. Gib alle Kurstypen (KursNr) – mit Ausnahme der Grundlagen-kurse (‘G..’) – aus, für die mehr ” als 4 Anmeldungen vorliegen.“ SELECT nt.KursNr, k.Titel, COUNT(*) FROM Nimmt teil nt, Kurs k WHERE nt.KursNr = k.KursNr GROUP BY nt.KursNr, k.Titel HAVING COUNT(*) > 4 AND nt.KursNr NOT LIKE ‘G%’ KursNr I09 P13 Titel Datenbanken C-Programmierung COUNT(*) 6 5 c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-26 3.2.5 Vereinigung, Differenz und Durchschnitt I Syntaktische Grundstruktur: ff SFW-Ausdruck TABLE Relationsname 8 9 UNION < = ˆ ˜ EXCEPT [ ALL ] CORRESPONDING (Attr 1, Attr 2,. . . ) : ; INTERSECT ff SFW-Ausdruck TABLE Relationsname h n oi Attributliste ORDER BY Positionsnummer I Anmerkungen / Erläuterungen: In SQL 89 war nur UNION definiert Die Ergebnis-Relationen der beiden Query-Ausdrücke (die Operanden) müssen hinsichtlich Anzahl und Typ der Spalten identisch sein. – Bei Angabe von CORRESPONDING wird zuvor eine Projektion auf die angegebenen Attribute durchgeführt. c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-27 Anmerkungen (Forts.): UNION, EXCEPT und INTERSECT führen automatisch eine Duplikateliminierung durch. – Durch Angabe von ALL kann dies unterdrückt werden. Die Attributnamen der Operanden-Relationen“ können von einander abweichen.5 ” Die ORDER BY-Klausel – falls angegeben –, muss am Ende des Query-Ausdrucks stehen. Anstelle von Attributnamen können in der ORDER BY-Klausel auch wieder die Positionsnum- mern der entsprechenden Attribute angegeben werden. Die Mengenoperationen sind nur auf dem äußersten Query-Level zulässig, nicht in Subqueries (SQL-92). Kurzschreibweisen (für UNION, INTERSECT, EXCEPT): Normalform SELECT * FROM Rel1 UNION SELECT * FROM Rel2 Kurzform SELECT * FROM (TABLE Rel1 UNION TABLE Rel2 ) 5 Bei ORACLE werden die Attributnamen vom oberen“ Query-Ausdruck übernommen. ” c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-28 S24. Erstelle eine Namensliste mit Teilnehmernummer bzw. Personalnummer von allen Kursteilneh” mern und Kursleitern (Ausgabe: Name, Nummer), alphabetisch nach Name sortiert.“ SELECT Name, TnNr AS Nummer FROM Teilnehmer UNION SELECT Name, PersNr FROM Kursleiter ORDER BY Name S25. Wie S24, aber nach Nummer sortiert.“ ” SELECT Name, TnNr AS Nummer FROM Teilnehmer UNION SELECT Name, PersNr FROM Kursleiter ORDER BY 2 S26. Gib alle Kurse (Ausgabe: KursNr, Titel) aus, die nicht Kurs ‘G08’ als Voraussetzung haben.“ ” SELECT * FROM Kurs EXCEPT SELECT Kurs.* FROM Kurs, Vorauss WHERE Vorauss.KursNr = Kurs.KursNr AND Vorauss.VorNr = ’G08’ c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-29 S27. Gib alle Kurse aus, die am Wohnort der jeweiligen Kurs-Teilnehmer angeboten werden ” (Ausgabe: Ort, AngNr, KursNr).“ SELECT t.Ort, nt.AngNr, nt.KursNr FROM Teilnehmer t, Nimmt teil nt WHERE t.TnNr = nt.TnNr INTERSECT SELECT a.Ort, nt.AngNr, nt.KursNr FROM Angebot a, Nimmt teil nt WHERE a.AngNr = nt.AngNr AND a.KursNr = nt.KursNr Ort Bremen Essen Hamburg Stuttgart Ulm AngNr 2 2 2 1 1 KursNr G08 P13 I09 I09 P13 c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-30 3.3 3.3.1 Datendefinition: Erzeugen, Löschen und Ändern von Relationen Erzeugen von Relationen I Beispiel 3-1: CREATE TABLE Angebot ( AngNr DECIMAL(5) NOT NULL, KursNr CHAR(6) NOT NULL, Datum DATE, Ort VARCHAR2(20)) CREATE TABLE Gehalt ( PersNr DECIMAL(5) NOT NULL, Gehalt DECIMAL(7,2)) c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-31 I Syntaktische Grundstruktur:6 CREATE TABLE Relationsname „ » Attributname1 Datentyp1 » » , Attributname2 Datentyp2 NULL NOT NULL NULL NOT NULL ff– ff– –« ,. . . I Datentypen:7 Datentyp Integer Real Dezimal Zeichenkette Zeichenkette Zeichenkette Bytestring Datum TupleID8 Spezifikation INTEGER FLOAT[(g)] DECIMAL(g[,k]) CHAR(Länge) VARCHAR2(Länge) LONG LONG RAW DATE ROWID Erläuterungen Oracle: NUMBER(38) Oracle: NUMBER[(g)], g = Genauigkeit (max. 38 Ziffern) Oracle: NUMBER(g[,k]) . . . , davon k Nachkommastellen feste Länge, max. 255 Zeichen var. Länge, max. 2.000 Zeichen max. 2 GB var. Länge, max. 2 GB (s. Fußnote zu LONG) Format einstellbar, bei uns: tt-mm-jjjj Tupel-Adresse 6 Dies ist die erforderliche Minimal-Syntax“. Wir werden im folgenden noch eine erweiterte Syntax kennenlernen 7 (Auswahl). Teilweise gibt”es synonyme Benennungen für denselben Datentyp. Die Beschränkungen sind jeweils (ORACLE-)implementierungsspezifisch. 8 ORACLE-spezifisch, kein SQL 89 oder SQL 2 Datentyp! Jede Relation in ORACLE hat ein Pseudo-Attribut ROWID (Aufbau: block.row.file, z.B.: 0000000F.0000.0002) c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-32 I Datentypen in SQL 92: Grundsätzlich: Verschiedene Schreibweisen für dasselbe bzw. ähnliche Konstrukt aus Kompatibilitätsgründen: z.B. CHARACTER VARYING = VARCHAR = CHAR VARYING Integer, Real: Wie bei ORACLE V7 Dezimal: Wird mit DECIMAL(n[,k]) oder NUMERIC(n) deklariert. CHAR VARYING (wird in ORACLE V7 mit VARCHAR2 deklariert; VARCHAR hatte in V5/V6 andere Bedeutung) Binärfelder (LONG RAW in ORACLE): Werden als BIT (feste Länge) bzw. BIT VARYING (variable Länge) deklariert. Zusätzlich weitere Datentypen wie . . . . . TIME TIMESTAMP TIME WITH TIME ZONE Nationale Zeichensätze ... c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-33 I Anmerkungen: Jede Tabelle/Relation gehört zu einem SCHEMA9 . Relationsnamen innerhalb eines Schemas müssen eindeutig sein. CREATE TABLE [schema.]tabname bewirkt Eintrag der Relation in den DB-Katalog. Bei Angabe von NOT NULL werden alle Insert- und Update-Operationen zurückgewiesen, die für dieses Attribut einen NULL-Wert liefern. Der DB-Katalog ist i.a. als Sammlung von Relationen realisiert.10 Folge: Katalog-Relationen können wie normale Relationen abgefragt werden. Für einige Katalogeinträge sind spezielle Zugriffs-Privilegien erforderlich (z.B. DBA-Status). Für (ORACLE-) Benutzer i.a. nützliche Katalog-Relationen: . . . . TAB COL VIEWS INDEXES Liste der vom Benutzer erzeugten Relationen und Sichten Liste der Attribute der vom Benutzer erzeugten Relationen Sichtendefinitionen Vom Benutzer auf Benutzer-Relationen erzeugte Indexe. 9 Wird nichts angegeben, so gehört es zum Default-Schema des Benutzers. In ORACLE V7 gibt es zwar ein CREATE SCHEMA Statement, es ist aber nur ein Schema je UserID zugelassen. 10 SQL92 legt die Katalogstruktur des Information Schema fest. Die derzeitig verfügbaren DBMSe haben jeweils eigene Strukturen. Ein komplettes Verzeichnis der ORACLE-Katalog-Relationen ist in der Katalog-Relation DTAB gespeichert. c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-34 I Probleme mit Minimal-Syntax“: ” Keine Angaben zur Werteindeutigkeit ⇒ wird auf ( Unique“-) Index verlagert (siehe später) ” Primärschlüssel aus Definition nicht erkennbar. Keine DB-unterstützte Integritätsprüfung beim Einfügen; es sei denn über Unique Index (siehe später). I Erweiterte CREATE-TABLE-Syntax gemäß SQL 92:11,12 1. Attributbezogene Klauseln: ff Datentyp i Attributname i [< default-klausel >] [< check-klausel >] Domain i 8 9 Konstante> > > > = < USER <default-klausel> ::= DEFAULT > > ... > > ; : NULL ff NOT NULL <check-klausel> ::= CHECK(<check-bedingung>) <check-bedingung> ::= Von einfachen Vergleichen bis hin zu komplexen EXISTSoder IN-Subqueries alles erlaubt.13 11 Zusätzliche Klauseln entsprechend SQL 2. Die meisten davon gab es bereits in SQL 89. 12 Von ORACLE V7 (und vielen anderen relationalen DBMS) heute noch nicht (voll) unterstützt. 13 In ORACLE V7 (und vielen anderen relationalen DBMSen) kann sich die Check-Bedingung nur auf das aktuelle Tupel beziehen. Subqueries auf andere Relationen sind nicht erlaubt. c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-35 2. Vereinbarung von Domains: Vergleichbar mit einfachen, nicht-geschachtelten Typ-Vereinbarungen in einer Programmiersprache Kann anschließend in CREATE-TABLE-Anweisung verwendet werden. CREATE DOMAIN domain-name [AS] datatype [ <Default-Klausel> ] [ <Constraint-Klausel> ] Beispiel 3-2: CREATE DOMAIN AngNr Type AS NUMERIC(5) CHECK (VALUE IS NOT NULL) CREATE DOMAIN GehaltType AS DECIMAL(8,2) CHECK (VALUE IS NULL) OR (VALUE > 0) 3. Relationsbezogene Klausel: hn UNIQUE PRIMARY KEY o i (Attribut1 [, Attribut2 ,. . . ]) c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-36 3.3.1.1 Schlüssel- und Fremdschlüssel-Deklarationen I Erweiterte SQL-DDL mit Primärschlüssel- (−→ PRIMARY KEY) und Fremdschlüssel-Angabe (−→ REFERENCES). I Ermöglicht, Beziehungen zwischen Relationen im Schema zu beschreiben. I Beispiel 3-3: (bezogen auf Abb. 3-2) CREATE TABLE Lieferant (LiefNr DECIMAL(5) PRIMARY KEY, LiefName CHAR(30) NOT NULL) CREATE TABLE Liefert (TeileNr DECIMAL(6) REFERENCES Teil(TeileNr), LiefNr DECIMAL(5) REFERENCES Lieferant(LiefNr), Preis DECIMAL(8,2), UNIQUE (TeileNr, LiefNr)) /* in-line“ Deklaration */ ” /* dto. in-line“ */ ” /* unbenannter Constraint */ CREATE TABLE Teil (TeileNr DECIMAL(6) CONSTRAINT teilpk PRIMARY KEY, TeileBez CHAR(20) NOT NULL, /* ↑ benannte Constraint, in-line“ */ ” Bestand DECIMAL(6)) CREATE TABLE TeileBest (BestNr DECIMAL(9) PRIMARY KEY, LiefNr DECIMAL(5) REFERENCES Lieferant, Termin DATE) c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-37 CREATE TABLE TeileBestPos (BestNr DECIMAL(9), BestPos DECIMAL(3), TeileNr DECIMAL(5), Menge DECIMAL(6) NOT NULL, CONSTRAINT tbp constrainsts UNIQUE (BestNr, BestPos), REFERENCES TeileBest(BestNr), REFERENCES Teile(TeileNr)) ... /* abgesetzte Constraint-Deklaration */ c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-38 I Anmerkungen: PRIMARY KEY und UNIQUE erzwingen beide Eindeutigkeit. UNIQUE kann mehrmals, PRIMARY KEY nur einmal je Relation angegeben werden. Falls sich PRIMARY KEY bzw. UNIQUE auf ein einzelnes Attribut beziehen, kann die in-line“ Darstellung gewählt werden: ” Attributname Attributtyp PRIMARY KEY bzw. Attributname Attributtyp UNIQUE PRIMARY KEY, UNIQUE und REFERENCES können sich auf mehrere Attribute (zusammen- gesetzter Schlüssel) beziehen (siehe z.B. Relation TeileBestPos) Auch explizite Fremdschlüssel-Deklaration ist möglich: CREATE TABLE Auftrag (AuftrNr DECIMAL(9) PRIMARY KEY, KdNr DECIMAL(9) Termin DATE FOREIGN KEY (KdNr) REFERENCES Kunde(KdNr)) alternativ: FOREIGN KEY KundeRef (KdNr) REFERENCES Kunde14 14 Wird bei REFERENCES nur der Relationsname angegeben, so bezieht sich REFERENCES auf den PRIMARY KEY der angegebenen Tabelle c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-39 I REFERENCES kann sich auch auf andere Attribute als den PRIMARY KEY einer Relation beziehen. Attribut(wert) muss in übergeordneter Relation eindeutig sein.15 Explizite Attributangabe in REFERENCES-Klausel erforderlich (ansonsten optional): CREATE TABLE Kunde (KdNr DECIMAL(9) PRIMARY KEY, KdName CHAR(30) NOT NULL, KdAnschrift CHAR(60) NOT NULL UNIQUE(KdName, KdAnschrift)) CREATE TABLE Adressen (Name CHAR(30), Adresse CHAR(60), FOREIGN KEY KundeRef (Name, Adresse) REFERENCES Kunde(KdName, KdAnschrift)) Wirkungsweise von PRIMARY KEY . . . REFERENCES (in der bisher betrachteten Form):16 . Überprüfung von Einfüge-, Lösch- und Änderungsoperationen auf Einhaltung der ReferenzBedingungen (z.B. keine Erzeugung von Waisenkindern“). ” . Zurückweisung referenzverletzender Anweisungen. . Keine automatische Anpassung abhängiger“ Werte. ” 15 Hier wird gefordert, dass für dieses Attribut bzw. die Attribut-Kombination eine UNIQUE-Spezifikation vorliegt. 16 mehr dazu später c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-40 3.3.2 Ändern einer Tabelle (Schemaänderung!) I Syntax (vereinfacht): ALTER TABLE Relationsname ff– ff „ » ADD NULL ,... Attributname1 Datentyp1 NOT NULL MODIFY « I Beispiele: A1: Erweitere die Teilnehmer-Relation um die Attribute PLZ vom Typ Number(4) und Strasse ” vom Typ CHAR(30).“ ALTER TABLE Teilnehmer ADD (PLZ DECIMAL(4), Strasse CHAR(30)) A2: Es existiere eine noch leere Tabelle TEILE. Eine zusätzliche Spalte PREIS soll hinzugefügt ” werden, die zwingend Werte enthalten soll.“ ALTER TABLE Teile ADD (Preis DECIMAL(8,2) NOT NULL) c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-41 I Anmerkungen: Neue Spalten werden stets hinten angehängt. Sofern die Relation bereits Tupel enthält, werden die neuen Attribute mit Nullwerten gefüllt. NOT NULL-Klausel daher nur bei leeren Relationen möglich. Nachträgliche Änderungen von Attribut-Definitionen (Typ, Größe“, NULL-Klausel) bei leerer ” Relation oder NULL-wertiger Spalte durch ALTER TABLE . . . MODIFY-Anweisung möglich. Löschen oder Umbenennen von Attributen ist nicht möglich. ORACLE erlaubt das Ändern des Relationsnamens mittels der Anweisung: RENAME alter Name TO neuer Name INGRES benutzt die Modify-Anweisung auch um die interne Speicherung von Relationen zu ändern: . MODIFY . MODIFY . MODIFY . MODIFY . ... Relation1 Relation2 Relation3 Relation4 TO TO TO TO HASH BTREE ISAM HEAP17 17 HEAP ist die interne Standard-Repräsentation bei INGRES c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-42 3.3.3 Löschen einer Tabelle I Syntax: DROP TABLE Relationsname I Wirkung: Löscht die angegebene Relation samt Inhalt und entfernt sie aus dem Katalog. I Beispiel 3-4: DROP TABLE Gehalt I Hinweis: Beendet bei automatisch auch die laufende Transaktion (implizites Commit) !18 Grund: Vermeidung von (aufwendigem) UNDO dieser Operation19 18 siehe später bei Transaktionsverwaltung 19 Der SQL-Standard überlässt es der jeweiligen Implementierung, ob DDL-Operationen mit DML-Operationen in einer Transaktion gemischt werden können oder nicht bzw. ob diese stets zu implizitem COMMIT führen. c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-43 3.3.4 Anlegen und Löschen von Indexen I Syntax (vereinfacht): CREATE [UNIQUE] INDEX Indexname ON Relationsname (Attributname1 [, Attributname2 , . . . ]) DROP INDEX Indexname [ON Relationsname] I Beispiel 3-5: CREATE INDEX Ort Sort ON Angebot (Ort) CREATE UNIQUE INDEX nt index ON Nimmt teil (AngNr, KursNr) DROP INDEX Datum Index I Anmerkungen: Indexnamen für vom Benutzer erzeugte Relationen müssen innerhalb eines Schemas eindeutig sein. Mehrere Indexe pro Relation erlaubt. Indexe können von Anfang an (bei noch leerer Relation) oder nachträglich definiert werden. Bei nachträglicher Definition und UNIQUE-Klausel müssen die betroffenen Attributwerte (bzw. Attributwert-Kombinationen) dieses Prädikat erfüllen. c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-44 3.4 3.4.1 Datenmanipulation: Einfügen, Löschen und Ändern von Tupeln Einfügen I Syntaktische Struktur: INSERT INTO Relationsname [(Attribut1 , Attribut2 , . . . )] ff VALUES(Wert1 , Wert2 ,. . . ) Query I Anmerkungen: Sollen nicht alle Attribute, sondern nur einige mit Werten gefüllt werden, so können diese explizit aufgezählt werden. Die nicht spezifizierten Attribute werden mit Nullwerten gefüllt. Es können daher nur solche Attribute ausgeblendet werden, für die Nullwerte erlaubt sind. Die Einfügewerte können als Konstante mittels VALUES-Klausel oder über eine Query bereitgestellt werden. Anzahl und Typ der mittels VALUE-Klausel oder Query bereitgestellten Werte müssen mit den implizit (keine Attributliste angegeben) oder explizit spezifizierten Attributen harmonieren. SQL-92 sieht vor, dass mehrere Tupelkonstante, durch Kommata getrennt, angegeben werden können. c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-45 Beispiele: I1: I2: I3: Füge einen neuen Teilnehmer (TnNr 200) für Kurs ‘G08’ und AngNr 1 in die Gebühren-Relation ” ein. Die Teilnamegebühr sei noch nicht bekannt.“ INSERT INTO Gebuehren VALUES (1, ‘G08’, 200, NULL) alternativ: INSERT INTO Gebuehren (AngNr, KursNr, TnNr) VALUES (1, ‘G08’, 200) Füge ein neues Kursangebot (AngNr 3) für ‘G08’ für den 15. März 1991 in ‘Ulm’ ein.“ ” INSERT INTO Angebot VALUES (3, ‘G08’, ‘15-03-1991’, ‘ULM’) Die Relation GEBUEHREN sei noch leer: Fülle die Attribute AngNr, KursNr und TnNr der ” Relation mittels den Einträgen in der Relation Nimmt teil. Das Attribut Gebuehr soll noch ohne Wert bleiben.“ INSERT INTO Gebuehren (AngNr, KursNr, TnNr) SELECT * FROM Nimmt teil I4: Eine Relation KURS STATISTIK(AngNr,KursNr,Ort,Anz Tnr) sei geeignet definiert. Sie sei ” noch leer. Sie soll mit den aktuellen Werten gefüllt werden.“ INSERT INTO Kurs Statistik SELECT a.AngNr, a.KursNr, a.Ort, COUNT(nt.TnNr) FROM Angebot a, Nimmt teil nt WHERE a.AngNr = nt.AngNr AND a.KursNr = nt.KursNr GROUP BY a.AngNr, a.KursNr, a.Datum, a.Ort c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-46 3.4.2 Löschen von Tupeln I Syntaktische Form: DELETE FROM Relationsname [ WHERE Bedingung ] I Anmerkung: Löscht alle Tupel [, für die die WHERE-Bedingung erfüllt ist,] aus der angegeben Relation. Entferne alle Tupel aus der TEILNEHMER-Relation.“ ” DELETE FROM Teilnehmer Anmerkung: Es werden nur die Tupel gelöscht, die (leere) Relation selbst (als Eintrag im Katalog) bleibt erhalten. D1: D2: Lösche in Nimmt Teil-Relation alle Einträge für Kurse, die vor dem 1. März 1990 stattgefunden ” haben.“ DELETE FROM Nimmt teil WHERE (AngNr,KursNr) IN ( SELECT AngNr, KursNr FROM Angebot WHERE Datum <‘01-03-1990’) c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-47 D3: Lösche alle Einträge aus der Nimm teil-Relation, für die es keinen korrespondierenden Eintrag ” (TnNr) in der Teilnehmer-Relation gibt“. DELETE FROM Nimmt teil WHERE TnNr NOT IN ( SELECT TnNr FROM Teilnehmer) c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-48 3.4.3 Ändern von Tupeln I Syntaktische Form: Form 1: UPDATE Relationsname [ Korrelationsvariable ] Attribut1 = Ausdruck1 [, Attribut2 = Ausdruck2 , . . . ] SET [ WHERE Bedingung ] Form 2: UPDATE Relationsname [Korrelationsvariable] SET (Attribut1 [, Attribut2 , . . . ] ) = ( subquery ) [ WHERE Bedingung ] I Anmerkung: Die Wertänderung wird für alle Tupel durchgeführt, für die die WHEREBedingung erfüllt ist ( Snapshot-Logik“) ” c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-49 U1: Erhöhe alle Kursgebühren (in der Relation GEBUEHREN) um 10%.“ ” UPDATE Gebuehren SET Gebuehr = Gebuehr ∗ 1.1 U2: Wie U-1, aber nur für die Teilnehmer mit TnNr > 150.“ ” UPDATE Gebuehren SET Gebuehr = Gebuehr ∗ 1.1 WHERE TnNr > 150 U3: Es existiere eine Relation STD GEBUEHR(KursNr, Gebuehr). Setze alle Gebühren, für die noch kein Wert spezifiziert wurde, auf die Standardgebühr.“ ” UPDATE Gebuehren g SET g.Gebuehr = ( SELECT s.Gebuehr FROM Std Gebuehr s WHERE g.KursNr = s.KursNr ) WHERE g.Gebuehr IS NULL c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-50 U4: Alle für ‘Ulm’ geplanten Kursangebote fallen aus. Setze AngNr für alle betroffenen Teilnehmer ” in Nimmt teil auf NULL.“ UPDATE Nimmt teil SET AngNr = NULL WHERE (AngNr, KursNr) IN (SELECT AngNr, KursNr FROM Angebot WHERE Ort = ‘Ulm’) U5: TN STAMM(TnNr, Name, Ort, Strasse, Anmerkungen) enthalte für alle Kursteilnehmer stets ” die aktuellen Personendaten. Aktualisiere die Tupel der Teilnehmer-Relation (Name, Ort) auf Basis der TN STAMM Relation.“ UPDATE Teilnehmer t SET (t.Name, t.Ort) = ( SELECT ts.Name, ts.Ort FROM Tn Stamm ts WHERE ts.TnNr = t.TnNr) c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-51 I Anmerkung: Die Semantik von mengen-orientierten Updates ist nicht immer ganz unproblematisch (z.B. bei self-referencing updates“). ” Beispiel 3-6: Angest (AngestNr, Name, Gehalt, AbtNr) Abteilung (Abtnr, Bez, MgrNr) Setze das Gehalt des Managers der Abteilung ‘Spielwaren’ auf das Doppelte des Durchschnitts” gehalts dieser Abteilung“ UPDATE Angest a SET a.Gehalt = (SELECT 2∗AVG (Gehalt) FROM Angest a1 WHERE a1.AbtNr = a.Abtnr) WHERE a.AngNr = (SELECT MgrNr FROM Abteilung WHERE Bez = ‘Spielwaren’) . . . durch den Update steigt das Durchschnittsgehalt! ☞ Die Auswertung der Assignment-Ausdrücke“ (sowie die Menge der zu ändernden Tupel) ” muss (systemintern) vor dem ersten Update vorgenommen werden! c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-52 3.5 Autorisierung I Syntaktische Grundstruktur:20 8 8 9 9 ff < ALL PRIVILEGES <[ TABLE ] relview = = GRANT <privilege> ON DOMAIN domain REVOKE : : ; ; [, <privilege>, . . . ] . . . ff PUBLIC [ WITH GRANT OPTION ]∗) TO userid1 [, userid2, . . . ] 8 SELECT > > > > DELETE > > < INSERT [(Attrib1 [, Attrib2 , . . . ])] <privilege> ::= > UPDATE [(Attrib1 [, Attrib2 , . . . ])] > > > > > :REFERENCES [(Attrib1 [, Attrib2 , . . . ])] ... 9 > > > > > > = > > > > > > ; ∗) nur in Verbindung mit GRANT wählbar 20 Entsprechend dem SQL 92 Standard c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-53 I Wirkungsweise/Erläuterungen: Jeder Benutzer hat die volle Verfügungsgewalt (Lesen, Ändern, Löschen) über die von ihm/ihr erzeugten ( privaten“) Relationen. ” Andere Benutzer haben per Default keinerlei Zugriffsrechte auf private“ Relationen anderer ” Benutzer. Ein Benutzer kann Zugriffsrechte auf seine privaten“ Relationen an andere Benutzer (gezielt ” oder an alle) vergeben. Die Art des Zugriffsrechts kann beschränkt werden (z.B. auf lesenden Zugriff) Beschränkung des Lesezugriffs auf ausgewählte Attribute mittels VIEW-Mechanismus. Beschränkung des Änderungsrechts (UPDATE) auf ausgew ählte Attribute durch explizite An- gabe der Attribute in der UPDATE-Klausel. Erteilung der Erlaubnis zur Weitergabe ( Vererbung“) von Zugriffsrechten (=⇒ WITH GRANT OPTION). ” I Diese Art der Vergabe von Zugriffsrechten nennt man auch discretionary access control“, weil ” es in der Verfügungsgewalt der Benutzer liegt, Zugriffsrechte zu vergeben. Im Gegensatz dazu bezeichnet mandatory access control“ eine Strategie, bei der zwingend jedem Paar Benutzer/Objekt ” ein Zugriffsrecht zugeordnet werden muss. (s.a. später bei Datenschutz und Datensicherheit) c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-54 3.6 Gewährleistung referentieller Integrität I Die Abbildung von Informationen aus der Realwelt in die relationale Modellwelt erfordert i.a. mehrere Relationen zur adäquaten Darstellung21 I Die logische Verknüpfung zwischen den Relationen erfolgt über Primar-/ Fremdschlüsselbeziehungen I Als Folge davon entstehen Schemata mit z.T. komplexen Abhängigkeitsbeziehungen zwischen den Relationen Lieferant LiefNr LiefName Liefert TeileNr LiefNr Preis FS FS TeileBest BestNr LiefNr Termin FS TeileBestPos BestNr BestPos TeileNr Menge FS FS Teil TeileNr TeileBez Bestand AuftragPos AuftrNr AuftrPos TeileNr Menge Preis FS FS Auftrag AuftrNr KdNr Termin FS Struktur OberTNr UnterTNr Anzahl FS FS Kunde KdNr KdName KdAnschrift Abbildung 3-2: Primärschlüssel – Fremdschlüssel (FS) – Beziehungen I Problem: 21 auf die Frage der Abbildung der Realwelt in die Datenbank-Modellwelt werden wir in einem späteren Kapitel zurückkommen. c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-55 Gewährleistung, dass alle Referenzbeziehungen stets konsistent sind. . bei Insert / Delete: kein Entstehen von Waisenkindern“ ” . bei Update: konsistente Änderung aller Referenzen I Möglichkeiten: passive Maßnahmen ☞ Zurückweisen konsistenzverletzender Operationen . per geeigneter Sichten-Definition . per DDL-Erweiterung =⇒ Prüfklauseln =⇒ Referenz-Beziehungen aktive Maßnahmen ☞ konsistente Propagation von Änderungen . per DDL-Erweiterung =⇒ Kaskadierung von Änderungen . Trigger-Mechanismen c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-56 3.6.1 Passive Integritätssicherung I Einfügen eines Tupels in abhängigerTabelle: =⇒ Prüfung, ob das Fremdschlüssel-Attribut“ in übergeordneter“ Tabelle existiert. ” ” I Löschen eines Tupels in übergeordneter“ Tabelle: ” =⇒ Prüfung, ob irgendwo noch abhängige“ Tupel existieren. ” 3.6.1.1 DEFINE VIEW . . . WITH CHECK OPTION I Korrektheits-Prüfung von Änderungsoperationen mittels geeigneter VIEW-Definition. I Beispiel 3-7: Es sollen nur solche Kursangebote in die ANGEBOT-Relation eingetragen werden ” können, deren Kursnummer tatsächlich auch existiert (Referenz: Kurs-Relation).“ 1. Versuch: CREATE VIEW AngebotNeu AS SELECT * FROM Angebot WHERE KursNr IN (SELECT KursNr FROM Kurs) c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-57 Test: 1. Einfügen zulässiges Tupel: INSERT INTO AngebotNeu VALUES (4,‘I09’, TO DATE(‘1-mar-91’), ‘Augsburg’) −→ OK 2. Einfügen nicht zulässiges Tupel: INSERT INTO AngebotNeu VALUES (4,‘I10’, TO DATE(‘1-mar-91’), ‘Augsburg’) −→ OK !? 2. Versuch: CREATE VIEW AngebotNeu AS SELECT * FROM Angebot WHERE KursNr IN (SELECT KursNr FROM Kurs) WITH CHECK OPTION c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-58 Test: 1. Einfügen zulässiges Tupel: INSERT INTO AngebotNeu VALUES (4,‘I09’, TO DATE(‘1-mar-91’), ‘Augsburg’) −→ OK 2. Einfügen nicht zulässiges Tupel: INSERT INTO AngebotNeu VALUES (4,‘I10’, TO DATE(‘1-mar-91’), ‘Augsburg’) −→ ERROR. . . : view WITH CHECK OPTION where-clause violation Bewertung als Schutz gegen Referenzverletzungen: +m Relativ gute Absicherungsmöglichkeiten bzgl. Insert-Fehlern. –m Stark eingeschränkte Tauglichkeit bzgl. Delete- und Update-Fehlern. c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-59 3.6.1.2 CREATE TABLE . . .: CHECK-Klausel I Beispiel 3-8: (bezogen auf Abb. 3-2) In die Relation Liefert“ sollen nur solche Tupel eingefügt werden können, für die TeileNr und ” LiefNr in den Relationen Teil“ bzw. Lieferant“ bereits definiert sind: ” ” CREATE TABLE Liefert (TeileNr DECIMAL(6) NOT NULL, LiefNr DECIMAL(5) NOT NULL, PREIS DECIMAL(8,2), UNIQUE (TeileNr, LiefNr), CHECK (EXISTS (SELECT * FROM Teil WHERE Teil.TeileNr = Liefert.TeileNr) AND (EXISTS (SELECT * FROM Lieferant WHERE Lieferant.LiefNr = Liefert.LiefNr))) c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-60 I Anmerkungen: Die CHECK-Bedingung kann eine beliebige Query mit Resultattyp boolean (−→ TRUE/FALSE) sein.22 Es werden später nur solche DML-Operationen ausgeführt, für welche die CHECK-Klausel zu TRUE evaluiert wird. Die Deklaration einer CHECK-Klausel ist jeweils an eine Tabellen-Deklaration (−→ CREATE TABLE) gebunden. Ab dem SQL2-Standard gibt es freistehende“ CHECK-Klauseln, die nicht Teil einer Tabellen” Definition sind (−→ ASSERTIONS). 22 Im 1989’er SQL-Standard war der Scope der CHECK-Klausel noch auf die eigene Relation beschränkt. Diese Beschränkung ist in SQL2 entfallen. c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-61 Mögliche Probleme bei Änderungsoperationen: . . . die Transaktion, nicht das einzelne Statement ist die Einheit der Integritätserhaltung (s. unten) I Beispiel 3-9: Änderung von LiefNr 444 in 4447. Lieferant LiefNr LiefName 222 Maier Co. 333 Müller GmbH 444 Schmidt KG REFERENCES Liefert TeileNr LiefNr Preis 3847 4921 5316 5319 5578 23.15 17.22 33.86 11.47 17.99 222 333 222 444 444 REFERENCES TeileBest BestNr LiefNr Termin 47123 444 960427 47124 333 960501 47125 222 960720 47128 222 960418 Abbildung 3-3: Fremdschlüssel-Beziehungen I Durchführung dieser Änderung erfordert an sich drei Updates Update Lieferant (444 −→ 4447) =⇒ Waisenkinder“ in Liefert und TeileBest ⇒ reject! ” Update TeileBest (444 −→ 4447) =⇒ Referenzbedingung verletzt ⇒ reject! dto. Update von Liefert ⇒ reject! c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-62 I Lösung: Deferred Constraint Checking23 ff ALL SET CONSTRAINTS DEFERRED constraint-name(n) SQL-Anweisung1 SQL-Anweisung2 ... ff ALL IMMEDIATE SET CONSTRAINTS constraint-name(n) I Wirkungsweise: Integritäts-Prüfungen werden temporär ausgesetzt und erst nach SET CONSTRAINTS . . . IMMEDIATE durchgeführt. Folgt auf DEFERRED“ keine IMMEDIATE“-Klausel, so werden die Integritäts-Prüfungen ” ” automatisch bei COMMIT WORK durchgeführt. Das Transaktionskonzept fordert Konsistenzerhaltung bei Änderungen erst zum Ende von Transaktionen! 23 In der vollen Version von SQL2 vorgesehen. c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-63 3.6.2 Aktive Integritätssicherung ⇒ führt in einer allgemeinen Form auf sog. Aktive/Reaktive Datenbanken“, Trigger“. ” ” 3.6.2.1 ON DELETE / UPDATE CASCADE I Automatische Propagation von Änderungen in die abhängigen“ Relationen. ” I Erweiterung der REFERENCES-Klausel I Syntax: . . . REFERENCES Relation [(Attrib1, Attrib2, . . . )] 8 CASCADE > ff ff > < 6 NULL 6ON DELETE SET 4 DEFAULT UPDATE > > : NO ACTION 2 93 > > =7 7 24 5 > > ; 24 Im vollen Umfang (z.B. ON UPDATE . . .) erst in SQL2 definiert, teilweise aber bereits seit längerem verfügbar (z.B. DB2/6000 V2). Zusätzlich noch optionale Klausel für initiale Belegung hinsichtlich IMMEDIATE/DEFERRED bzw. NOT DEFERRABLE. c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-64 I Beispiel 3-10: (für UPDATE) CREATE TABLE Liefert (TeileNr DECIMAL(6) REFERENCES Teil ON UPDATE CASCADE, LiefNr DECIMAL(5) REFERENCES Lieferant ON UPDATE CASCADE, Preis DECIMAL(8,2), UNIQUE TeileNr, LiefNr)) CREATE TABLE TeileBest (BestNr DECIMAL(9) PRIMARY KEY, LiefNr DECIMAL(5) REFERENCES Lieferant ON UPDATE CASCADE, Termin DATE) I Beispiel für DELETE . . . CASCADE CREATE TABLE Struktur (OberTNr DECIMAL(5) REFERENCES Teile(TeileNr) ON DELETE CASCADE, UnterTNr DECIMAL(5) REFERENCES Teile(TeileNr) ON DELETE CASCADE, Anzahl DECIMAL(3)) c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-65 I Wirkung von ON DELETE CASCADE: Löschen äbhängigerTupel, ggf. kaskadierend Lieferant LiefNr 222 333 444 LiefName Maier & Co. Müller GmbH Schmidt KG DELETE REFERENCES ... ON DELETE CASCADE TeileBest BestNr LiefNr Termin 47123 444 910427 47124 333 910501 47125 222 910720 47128 222 910418 REFERENCES ... ON DELETE CASCADE TeileBestPos BestNr BestPos TeileNr Menge 47123 1 5319 50 47123 5578 2 30 47124 4921 80 1 47125 3847 40 1 47125 5316 10 2 20 47128 5316 1 47128 3847 60 2 c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-66 I Wirkung von ON UPDATE CASCADE: =⇒ Propagation des geänderten Attributwertes in die referenzierenden Relationen. Ausgangssituation: Lieferant LiefNr 222 333 444 REFERENCES ... ON UPDATE CASCADE REFERENCES ... ON UPDATE CASCADE TeileBest BestNr LiefNr 47123 444 47124 333 47125 222 47128 222 Liefert TeileNr LiefNr Preis 3847 4921 5316 5319 5578 222 333 222 444 444 Update LiefNr 444 4447: LiefName Maier & Co. Müller GmbH Schmidt KG 23.15 17.22 33.86 11.47 17.99 Termin 960427 960501 960720 960418 Lieferant LiefNr LiefName Update 222 333 4447 Maier & Co. Müller GmbH Schmidt KG U p date 444 U p date 4447 44 4 Liefert TeileNr LiefNr Preis 3847 222 23.15 4921 333 17.22 5316 222 33.86 5319 444 11.47 5578 444 17.99 4447 TeileBest BestNr LiefNr Termin 47123 444 960427 47124 333 960501 47125 222 960720 47128 222 960418 Resultat: Lieferant LiefNr LiefName 222 333 4447 Maier & Co. Müller GmbH Schmidt KG Liefert TeileNr LiefNr Preis 3847 4921 5316 5319 5578 222 333 222 4447 4447 23.15 17.22 33.86 11.47 17.99 TeileBest BestNr LiefNr 47123 4447 47124 333 47125 222 47128 222 Termin 960427 960501 960720 960418 I Bewertung: ⊕ Wichtiges Konzept zur Erzwingung referentieller Integrität ⊕ Konzept kann durch geeignete Datenstrukturen auch implementierungsseitig effizient unterstützt werden (=⇒ Performance!) c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-67 3.7 3.7.1 Sichten Einführung Eine Sicht ist ein Ausschnitt“ aus der Datenbank (genauer: ein – möglicherweise umstrukturierter ” – Teil des logischen DB-Schemas), der als externes Schema einem Benutzer/Anwendungsprogramm zur Verfügung gestellt wird. Eine Sicht ist eine zusätzliche, virtuelle“ (berechnete) Relation und wird wie diese angesprochen. ” Es handelt sich um abgeleitete Daten; die Ableitung erfolgt bei jedem Zugriff, d.h. es wird kein Schnappschuss“ bei der Definition der Sicht erzeugt, sondern die Sicht wird jedesmal beim Zugriff ” neu berechnet“ (dies ist zumindest der logische Effekt). ” Änderungen der (Basis-) Relationen sind in den Sichten sichtbar und umgekehrt! I Realisierung der Externen Ebene (⇒ ANSI 3-Ebenen-Architektur) Abbildung 3-4: 3-Ebenen-Architektur c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-68 I Vorteile von Sichten: Vereinfachung von Anfragen (→ Vorformulierung komplexer Teilanfragen) Strukturierung der Datenbankbeschreibung nach individuellen“ Bedürfnissen ” stabile Schnittstelle für Anwendungen (→ bei Schemaänderungen) Datenschutz ( need-to-know“: Verbergen von nicht benötigten Daten) ” I Beispiel: Relation: Gegeben sei die folgende Relation des logischen DB-Schemas mit Prüfungsdaten: Prüf(Studienfach, Fach, Student, Prüfer, Datum, Note) Durch entsprechende Sichten können individuelle Informationsbedürfnisse befriedigt werden: . Der Fachbereich Informatik und Informationswissenschaft sieht nur die Daten der eigenen“ ” Studenten. . Das Prüfungsamt sieht alle Daten. . Jeder Student darf seine eigenen Daten sehen (aber nicht ändern) . Die Kommission zur Vergabe von Stipendien darf von Studenten die Durchschnittsnote sehen. . Der Dekan darf statistische Daten über Absolventen des letzten Jahrgangs lesen. . Sekretariate dürfen Prüfungsdaten der zugehörigen Professoren einsehen. I SQL-Syntax: CREATE VIEW view-name AS query [ WITH CHECK OPTION ] c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-69 I Probleme mit Sichten: Bearbeitung von Anfragen auf Sichten: Substituiere definierende SQL-Anfrage für den Namen der Sicht ( Query Substitution“) ” ⇒ Orthogonalität der Sprache besonders wichtig: SQL ⇔ Relationenalgebra Änderungsoperationen auf Sichten: . Überhaupt zulässig? Eindeutigkeit? Welche Einschränkungen erforderlich? . Wie sollen aus View-Updates die Updates der gespeicherten Datenbank hergeleitet werden? . Welches sind vernünftige“ Update-Operationen? ” I Kriterien für Änderungsoperationen: Effektkonformität: Änderungen, die auf einer Sicht formuliert werden, sollen nach der Änderung der Basisdatenbank zu einer Ausprägung der Sicht führen, die dem entspricht, als ob diese Änderung direkt auf der Sicht ausgeführt wurde (⇒ Korrektheit der Transformation). Minimalität: Die Basisdatenbank sollte nur minimal geändert werden, um den gewünschten Effekt zu erzielen. Konsistenzerhaltung: Die Änderung einer Sicht darf zu keinen Integritätsverletzungen der Ba- sisdatenbank führen. Respektierung des Datenschutz: Wird die Sicht aus Datenschutzgründen eingeführt, darf von der Änderung nicht der bewusst ausgeblendete Teil der Basisdatenbank betroffen sein. c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-70 3.7.2 Verschiedene Arten von Sichten . . . hier am Beispiel des Relationenmodells: I I I I Projektionssichten Selektionssichten Verbundsichten Aggregierungssichten 3.7.2.1 Projektionssichten (Project Views) I Beispiel 3-11: Gegeben seien zwei Relationen: MGA(Mitarbeiter, Gehalt, Abteilung), AL(Abteilung, Leiter) Projektionssicht MA . In Relationenalgebra: MA:= πMitarbeiter, Abteilung(MGA) . In SQL: CREATE VIEW MA AS SELECT Mitarbeiter, Abteilung FROM MGA c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-71 I Probleme: Einfügungen: Setzen der Attribute, die in der Sicht fehlen . . . ? Beispiel 3-12: INSERT INTO MA VALUES (‘Zuse’, ‘Info’) wird transformiert zu INSERT INTO MGA VALUES (‘Zuse’, NULL, ‘Info’). ⇒ Konsistenzerhaltung: Gehalt darf nicht als NOT NULL deklariert worden sein. (Alternative: Verwendung von Defaultwerten). Nur wenn Schlüssel der Basisdatenbank in der Sicht erhalten bleiben, entspricht ein Tupel der Sicht genau und eindeutig einem Tupel der Basisrelation. 3.7.2.2 Selektionssichten (Select Views) I Beispiel 3-13: Relationenalgebra: MG := σGehalt>20πMitarbeiter, Gehalt(MGA) SQL: CREATE VIEW MG AS SELECT Mitarbeiter, Gehalt FROM MGA WHERE Gehalt > 20 c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-72 I Problem: Ein Tupel der Sicht kann durch eine Änderung in den nichtselektierten Teil der Sicht bewegt werden (Tupelmigration). Beispiel 3-14: Das Tupel MGA(‘Zuse’, 25, ‘Info’) wird durch UPDATE MG SET Gehalt = 15 WHERE Mitarbeiter = ‘Zuse’ aus der Sicht MG entfernt! Übersetzung: UPDATE MGA SET Gehalt = 15 WHERE Mitarbeiter= ‘Zuse’ AND Gehalt > 20 Beachte: Die Selektionsbedingung muss um die Sichtbedingung erweitert werden, da ansonsten auch ein Tupel MGA(‘Zuse’, 10, ‘Info’) von der Änderung betroffen wäre, obwohl dieses nicht in der Sicht MG liegt! Ist die Sicht MG aus Datenschutzgründen angelegt worden, sollte die Änderung zurückgewiesen werden. Tupelmigration kann explizit durch die WITH CHECK OPTION-Klausel verhindert werden. Beispiel 3-15: CREATE VIEW MG AS SELECT Mitarbeiter, Gehalt FROM MGA WHERE Gehalt > 20 WITH CHECK OPTION c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-73 3.7.2.3 Verbundsichten (Join Views) I Beispiel 3-16: Relationenalgebra: MGAL := MGA SQL: 1 AL CREATE VIEW MGAL AS SELECT m.Mitarbeiter, m.Gehalt, m.Abteilung, a.Leiter FROM MGA m, AL a WHERE m.Abteilung=a.Abteilung I Änderungstransformationen: oft nicht eindeutig! Minimalität I Beispiel 3-17: INSERT INTO MGAL VALUES (‘Turing’, 30, ‘Info’, ‘Zuse’) Transformation: 1. MGA: INSERT INTO MGA VALUES (’Turing’,30,’Info’) 2. AL: hier sind ggf. verschiedene Änderungen denkbar: (a) INSERT INTO AL VALUES (‘Info’, ‘Zuse’) (b) UPDATE AL SET Abteilung=‘Info’ WHERE Leiter = ‘Zuse’ b) entspricht der Minimalitätsforderung, ist aber nicht effektkonform (die Mitarbeiter der Abteilung Mathematik haben nun keinen Leiter mehr!). c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-74 I Analoge Probleme ergeben sich bei Löschungen. Etwa kann für die Löschung des Tupels MGAL(‘Turing’, 30, ‘Info’, ‘Zuse’) entweder ein Tupel in MGA oder in AL oder in beiden Relationen gelöscht werden. Konsequenz: Änderungsoperationen für derartige Sichten in SQL verboten. Analoge Probleme bei Mengenoperationen 3.7.2.4 Aggregierungssichten I Verwendung von Gruppierung und Aggregierung I Spezialfall von berechneten Werten in der DB. I Beispiel 3-18: CREATE VIEW AS(Abteilung,SummeGehalt) AS SELECT Abteilung, SUM(Gehalt) FROM MGA GROUP BY Abteilung I Änderung auf aggregierten Werten nicht sinnvoll: I Beispiel 3-19: UPDATE AS SET SummeGehalt = Summe + 1000 WHERE Abteilung = ‘Info’ c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-75 I Klassifikation der Problembereiche: Vermeidung von Integritätsverletzungen Vermeidung von Seiteneffekten auf nicht sichtbaren Teilen der Datenbank aus Datenschutz- gründen Minimalität ggf. nicht eindeutig ⇒ Auswahlproblem Keine sinnvolle Transformation möglich 1:1-Beziehung zwischen Sicht und Basisdatenbank kann verletzt sein (etwa beim Wegprojizieren von Schlüsseln). c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-76 3.7.3 Integritätswahrung bei Sichten in SQL I Integritätsverletzende Änderungen in Sichten werden zurückgewiesen. I Die Behandlung potentiell datenschutzverletzender Sichtänderungen unterliegt der Benutzerkontrolle (⇒ ‘WITH CHECK OPTION’-Klausel). I Sichten, die zu nicht eindeutigen Transformationen bei Änderungen führen können, werden als nicht änderbar klassifiziert (unabhängig von einer speziellen Änderungsoperation). Auf diesen Sichten sind keine Änderungen erlaubt. I Elementare Änderungen auf Sichtebene müssen zu elementaren Änderungsoperationen der Basisrelation abgebildet werden (⇒ DISTINCT-Klausel). I Eine Sicht ist in SQL genau dann änderbar, wenn alle folgenden Bedingungen erfüllt sind: Die Sicht ist eine reine Selektionsabfrage (d.h.: kein Verbund, keine Mengenoperationen). Es ist kein DISTINCT enthalten. Keine Arithmetik und Aggregatsfunktionen in der SELECT-Klausel. Genau eine Referenz auf eine Relation im FROM-Teil Keine Unterabfragen mit Selbstbezug, d.h. die in der FROM-Klausel angesprochene Relation darf nicht in FROM-Klauseln der Unterabfragen verwendet werden. Keine Gruppierung c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-77 3.7.4 Auswertungsaspekte I Grundidee bei der Ausführung von Anfragen auf Sichten: Setze die View-Definition (=SQL-Anfrage1) in die Benutzer-Anfrage (=SQL-Anfrage2) an der Stelle ein, wo der Name der Sicht angesprochen wird. . . . rein syntaktische String-Ersetzung. Aber: in SQL aufgrund div. Einschränkungen der Or- thogonalität nicht möglich! I Restriktionen von SQL: Einsetzungen von Unterabfragen im FROM-Teil seit SQL-92 möglich, aber (noch) nicht in allen SQL-Dialekten (-Implementierungen); außerdem: View-Ersetzung auch schon vorher! Geschachtelte Aggregierungen nicht in einer SQL-Anfrage möglich. I Konsequenz: In SQL können Sichten nicht direkt durch Einsetzen der Definitionen ausgewertet werden. Deswegen wird ein syntaktisches Mischen“ vorgesehen: ” . In der SELECT-Klausel werden Sichtattribute ersetzt bzw. durch ihren Berechnungsterm ersetzt. . Im FROM-Teil werden die Namen der Originalrelationen aufgeführt. . In der WHERE-Klausel erfolgt eine konjunktive Verknüpfung von Sicht- und Anfragebedingungen. c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-78 Dies kann zu unerwarteten Problemen führen: Beispiel 3-20: . Sicht: CREATE VIEW DS (Abteilung, GehaltsSumme) AS SELECT Abteilung, SUM(Gehalt) FROM MGA GROUP BY Abteilung . Anfrage: SELECT Abteilung FROM DS WHERE GehaltsSumme > 500 . Mögliche Übersetzungen: SELECT Abteilung FROM MGA WHERE SUM(Gehalt) > 500 GROUP BY Abteilung SELECT Abteilung FROM MGA GROUP BY Abteilung HAVING SUM(Gehalt) > 500 c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-79 Beispiel 3-21: . Anfrage: SELECT AVG(GehaltsSumme) FROM DS . Übersetzung durch Mischen: SELECT AVG(SUM(Gehalt)) FROM MGA GROUP BY Abteilung Aber: Geschachtelte Aggregationsfunktionen nicht erlaubt in SQL! ⇒ Diese Anfrage kann nur mit geschachtelten Unteranfragen im FROM-Teil ausgeführt werden. c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-80 3.8 Nullwerte in SQL I SQL unterstützt einen speziellen Wert NULL für alle Domänen. I Dieser hat die Bedeutung Wert nicht bekannt“ und ist verschieden von dem numerischen Wert ” 0 und einer Zeichenkette der Länge 0. I Behandlung von Nullwerten spezielle Selektionsbedingung bzgl. Nullwerten: . . . WHERE Attrib IS [NOT] NULL Sortieren nach nullwertigem Attribut: Tupel mit Nullwerten in dem betreffenden Attribut stehen stets am Anfang der Ergebnis-Tabelle, egal ob ASC oder DESC angegeben wurde. In arithmetischen Ausdrücken: Wenn einer oder beide Operanden nullwertig sind, ist das Ergebnis NULL. In booleschen Ausdrücken: TRUE ∧ NULL ⇒ TRUE ∨ NULL ⇒ const = NULL ⇒ const ! = NULL ⇒ NULL TRUE unknown unknown Bei Gruppierung (GROUP BY) nach nullwertigem Attribut: Nullwert wird wie ein normaler Wert behandelt, bildet ggf. eine eigene Gruppe. Bei Anwendung von Aggregat-Funktionen (AVG, SUM, COUNT, . . . ): Nullwerte werden bei der Auswertung ignoriert. c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-81 Beispiele: Gegeben sei die folgende Relation: Gebuehren AngNr 2 2 1 1 1 2 1 1 1 2 1 2 1 KursNr G08 P13 G08 P13 I09 P13 I09 I09 I09 P13 I09 I09 P13 TnNr 143 143 145 146 146 149 155 171 173 177 185 187 194 Gebuehr 500.00 400.00 ← Nullwert 300.00 ← Nullwert 350.00 ← Nullwert ← Nullwert 400.00 ← Nullwert 450.00 ← Nullwert ← Nullwert ⇒ In der Literatur werden Nullwerte oftmals durch verschiedene Sonderzeichen, z.B. ω, ⊥ dargestellt. Hier verwenden wir einfach eine Leerstelle. . Darüber hinaus kann man verschiedene Sorten von Nullwerten unterscheiden (z.B. Wert ” unbekannt, aber vorhanden – unknown“, Wert existiert nicht – not existent“, es ist nicht ” ” bekannt, ob ein Wert existiert – no information“, . . .) . SQL kennt jedoch nur einen Nullwert NULL“ mit der Bedeutung Wert unbekannt“. ” ” c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-82 N1: SELECT Gebuehren.*, Gebuehr - 100 FROM Gebuehren AngNr KursNr TnNr Gebuehr 2 G08 143 500.00 2 P13 143 400.00 1 G08 145 1 P13 146 300.00 1 I09 146 2 P13 149 350.00 1 I09 155 1 I09 171 1 I09 173 400.00 2 P13 177 1 I09 185 450.00 2 I09 187 1 P13 194 Gebuehr-100 400.00 300.00 200.00 250.00 300.00 350.00 c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-83 N2: SELECT COUNT(*), SUM(Gebuehr), SUM(Gebuehr)/COUNT(*), AVG(Gebuehr) FROM Gebuehren COUNT(*) SUM(Gebuehr) SUM(Gebuehr)/COUNT(*) 13 2400.00 184.615 AVG(Gebuehr) 400.00 Die hierbei auftretende Unstimmigkeit ist in der Literatur als SQL-Count Bug“ be” kannt geworden. c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-84 N3: SELECT * FROM Gebuehren ORDER BY KursNr, AngNr AngNr KursNr TnNr 1 G08 145 2 G08 143 1 I09 146 1 I09 155 1 I09 173 1 I09 185 1 I09 171 2 I09 187 1 P13 146 1 P13 194 2 P13 143 2 P13 177 2 P13 149 Gebuehr 500.00 400.00 450.00 300.00 400.00 350.00 c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-85 N4: SELECT AngNr, KursNr, SUM(Gebuehr), AVG(Gebuehr) FROM Gebuehren GROUP BY KursNr, AngNr ORDER BY KursNr, AngNr AngNr KursNr SUM(Gebuehr) AVG(Gebuehr) 1 G08 2 G08 500.00 500.00 1 I09 850.00 425.00 2 I09 1 P13 300.00 300.00 2 P13 750.00 375.00 c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-86 3.9 Erweiterte Relationenalgebra N5. Gib alle Kurse (Ausgabe: KursNr, Titel) zusammen mit ihren eventuellen direkten Vorausset” zungen (Ausgabe: VorNr) aus.“ Ausgangs-Relationen: Kurs KursNr G08 G10 P13 I09 Titel Grundlagen I Grundlagen II C-Programmierung Datenbanken SQL-Formulierung (Versuch): SELECT Kurs.*, Vorauss.VorNr FROM Kurs, Vorauss WHERE Kurs.KursNr = Vorauss.KursNr Resultat KursNr P13 P13 I09 I09 I09 G08 G10 Titel C-Programmierung C-Programmierung Datenbanken Datenbanken Datenbanken ?? ?? VorNr G08 G10 G08 G10 P13 Vorauss VorNr G08 G10 G08 G10 P13 KursNr P13 P13 I09 I09 I09 Problem: Kurse, die keine Voraussetzungen haben (hier: G08 und G10), erscheinen nicht in der Ergebnis-Relation bzw. der Ausgabe, da der Join sie wegfiltert“. ” c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-87 3.9.1 R @ F S: Outer Joins Linker Außen-Verbund“ (left outer join): Alle Tupel der linken Relation (d.h. alle ” R-Tupel) sind im Ergebnis enthalten. Gibt es für ein Tupel ri ∈ val(R) kein S-Tupel, das F erfüllt, so werden die S-Attribute im Ergebnis-Tupel mit Nullwerten aufgefüllt. Achtung: @ F und @ F sind nicht kommutativ! I Formen des Outer Join (gemäß SQL 2): Left Outer Join: Stellt sicher, dass alle Zeilen der linken Tabelle im Ergebnis enthalten sind (siehe unten) Right Outer Join: Analog, jedoch überleben hier die Zeilen der rechten Tabelle Full Outer Join: Kombination von Left + Right Outer Join: Alle Zeilen beider Tabellen sind mind. 1× im Ergebnis enthalten (ggf. links oder rechts mit Nullwerten aufgefüllt) c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-88 I Beispiel 3-22: R R @ A 1 2 3 4 A=C S: B Hans Ilse Hans Klara B Hans Ilse Ilse Hans Klara C C 2 2 3 6 D München Ulm Stuttgart Passau D S ← 2 2 3 München Ulm Stuttgart ← @ C=A R: C D A B Nullwerte A 1 2 2 3 4 S Formulierung von Anfrage N5 mittels (Left) Outer Join:25 N5’: SELECT k.*, v.VorNr FROM Kurs AS k LEFT OUTER JOIN Vorauss AS v 26 ON k.KursNr = v.KursNr KursNr G08 G10 I09 I09 I09 P13 P13 Titel Grundlagen I Grundlagen II Datenbanken Datenbanken Datenbanken C-Programmierung C-Programmierung VorNr ← Nullwert ← Nullwert G08 G10 P13 G08 G10 25 Wie in SQL 2 spezifiziert 26 SQL-2 verbindet die Korrelationsvariable mit dem Tabellennamen mittels AS-Klausel c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-89 I Hinweise zu ORACLE ORACLE verwendet (noch?) eine andere syntaktische Form, um den Outer Join darzustellen. Die Anfrage N5’ wird deshalb in ORACLE wie folgt formuliert: SELECT ks.*, v.VorNr FROM Kurs k, Vorauss v WHERE k.KursNr = v.KursNr (+) Das ”(+)” im obigen Beispiel bezieht sich auf die Vorauss-Relation. – Es wird (bei ORACLE) also derjenige Operand markiert, der ggfs. mit Nullwerten aufgefüllt wird! In einer Outer-Join-Anweisung darf (bei ORACLE) höchstens eine Tabelle ohne ”(+)” auftre- ten. Wird der Outer Join über mehr als ein Attribut (z.B. bei zusammengesetztem Schlüssel) spezifiziert, so muss ”(+)” für alle diese Attribute in der WHERE-Klausel angegeben werden (siehe Anfrage-Beispiel S4) ☞ Achtung: Nullwerte sind spezielle logische Werte und entsprechen nicht einem Leerzeichen oder dem numerischen Wert Null! (→ Dreiwertige Logik (true, false, unknown)) c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-90 N6. Gib alle Kursangebote (Ausgabe: *) zus. mit den vorliegenden Anmeldungen (TnNr) aus.“ ” SELECT a.*, nt.TnNr SQL 2 FROM Angebot AS a LEFT OUTER JOIN Nimmt teil AS nt ON (a.KursNr = nt.KursNr) AND (a.AngNr = nt.AngNr) SELECT a.*, nt.TnNr FROM Angebot a, Nimmt teil nt WHERE a.KursNr = nt.KursNr (+) AND a.AngNr = nt.AngNr (+) AngNr 1 2 1 2 1 1 1 1 1 2 3 1 1 2 2 2 KursNr G08 G08 G10 G10 I09 I09 I09 I09 I09 I09 I09 P13 P13 P13 P13 P13 Datum 13–01–1996 24–02–1996 01–02–1996 15–02–1996 27–03–1996 27–03–1996 27–03–1996 27–03–1996 27–03–1996 23–04–1996 29–05–1996 28–05–1996 28–05–1996 01–07–1996 01–07–1996 01–07–1996 Ort München Bremen München Hamburg Stuttgart Stuttgart Stuttgart Stuttgart Stuttgart Hamburg München Ulm Ulm Essen Essen Essen ORACLE TnNr 145 143 146 155 173 185 171 187 146 194 143 177 149 c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-91 N7. Wie S4, aber zusätzlich zur Teilnehmernummer soll jeweils auch noch der Teilnehmername ” ausgegeben werden.“ SELECT a.*, nt.TnNr, t.Name FROM Angebot a, Nimmt teil nt, Teilnehmer t WHERE a.KursNr = nt.KursNr (+) AND a.AngNr = nt.AngNr (+) AND nt.TnNr = t.TnNr (+) N8. ORACLE Gib alle Kursangebote aus, für die sich kein Teilnehmer angemeldet hat“. ” SELECT a.*, nt.TnNr FROM Angebot a, Nimmt teil nt WHERE a.KursNr = nt.KursNr (+) AND a.AngNr = nt.AngNr (+) AND nt.TnNr IS NULL ORACLE I Anmerkungen: Die obige SQL-Anfrageformulierung mittels Outer Join ist eine von mehreren Möglichkeiten, Anfrage S9 in SQL umzusetzen. Der Test auf Nullwert muss mittels IS NULL bzw. IS NOT NULL durchgeführt werden. = NULL“ bzw. <> NULL“ führen nicht zum gewünschten Ergebnis. ” ” Tests mittels IS [NOT] NULL sind auch ohne Outer Joins in Selektionen möglich. c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-92 3.10 Literaturhinweise Abiteboul, S., R. Hull und V. Vianu (1995). Foundations of Databases. Addison-Wesley. Date, C.J. und H. Darwen (1993). A Guide to the SQL Standard. Addison-Wesley Publ. Comp., 3 Aufl. Heuer, A. und G. Saake (2000). Datenbanken: Konzepte und Sprachen. MITP Verlag, Bonn, 2. Aufl. ISO (1992). Database Language SQL, International Standard. ISO. ISO/IEC 9075:1992, DIN 66315. Kandzia, P. und H.-J. Klein (1993). Theoretische Grundlagen relationaler Datenbanksysteme. BI Wissenschaftsverlag, Reihe Informatik. Melton, J. und A. Simon (1993). Understanding the New SQL: A Complete Guide. Morgan Kaufmann Publishers. Melton, J. und A. Simon (2002). SQL:1999 – Understanding Relational Language Components. Morgan Kaufmann Publishers. Rautenstrauch, C. und M. Moazzami (1990). Effiziente Systementwicklung mit ORACLE . Addison-Wesley. Türker, C. (2003). SQL:1999 & SQL:2003 – Objektrelationales SQL, SQLJ & SQL/XML. dpunkt.verlag, Heidelberg. c M. Scholl, 2005/06 – Informationssysteme: 3. SQL – Structured Query Language 3-93