Unterabfragen (Subqueries) Die kürzeste Formulierung ist folgende: SELECT Felderliste FROM Tabelle1 WHERE Tabelle1.Feldname Operator (SELECT Feldname FROM Tabelle2 WHERE Bedingung); wobei Tabelle1 und Tabelle2 ein Beziehungsfeld (Feldname) haben. Die Basisoperatoren sind: • Vergleichsoperatoren : >=, <, =, >, >=, <> (ungleich); • IN • NOT • ANY • SOME • ALL • EXISTS Beispiel : Man ermittelt Namen und Einwohnerzahl aller Hauptstädte. Bemerkung: Haupstadt ist ein Attribut der Relation LAND und Einwohnerzahl ist ein Attribut der Relation STADT. Man wird deshalb die Abfrage in zwei Schritten lösen. SELECT Name, Einwohner FROM Stadt WHERE Name IN ( SELECT Hauptstadt FROM Land;); Beispiel : Ist in der Bibliothek mindestens ein Buch im Bereich der Informatik vorhanden ? SELECT * FROM Bücher WHERE Bereich = ANY (SELECT Bereich FROM Bücher WHERE Bereich = „Informatik“); ANY und SOME haben die selbe Rolle wie der Operator IN; der Vergleich ist wahr, wenn er für wenigstens einen einzigen Tupel bestätigt werden kann. Mit dem Operator ALL, ist der Vergleich wahr, wenn er für alle Tupel bestätigt werden kann. Beispiel : Man entziehe die Informationen, betreffend die Nummer und das Datum des Dokumentes, die Kode des Produktes und die MWSt für alle Produkte, dessen MWSt grösser als die MWSt des Produktes mit der Kode 1222 ist. SELECT Nr, Datum, Kode, MWSt FROM Rechnungen WHERE MWSt > ALL (SELECT MWSt FROM Rechnungen WHERE Kode = 1222); Beispiel: Man entziehe die Liste der Bücher die ausserhalb der Hauptstadt geliefert werden. SELECT * FROM Bücher WHERE Ort <>ALL (SELECT Ort FROM Bücher WHERE Ort =“Bukarest“); Hier ist der Operator <> ALL derselbe wie der Operator NOT IN. Der Operator EXISTS benutzt die Unterabfragen als Bedingung. Man analysiert die Ergebnisse der Unterabfragen. Im Falle wo keine Tupel im Ergebnis vorkommen, wird der Wert „False“ angezeigt. Beispiel: Gibt es in der Bibliothek Bücher die nach dem Jahr 1995 veröffentlicht wurden? SELECT * FROM Bücher WHERE EXISTS (SELECT* FROM Bücher WHERE Jahr > 1995); Vereinigung von Ergebnistabellen Der Befehl ist: SELECT Felderliste FROM Tabelle1 UNION SELECT Felderliste FROM Tabelle2 [GROUP BY Gruppierungsfeld] [HAVING Gruppierungskriterium] [UNION SELECT Felderliste FROM Tabelle3 [GROUP BY Gruppierungsfeld] [HAVING Gruppierungskriterium]] [UNION…] [ORDER BY Sortierungskriterium]; Beispiel: Ermittelt die Namen aller Städte und Länder: SELECT Name FROM Stadt UNION SELECT Name FROM Land; Datenbank–Änderungen. Das Einbringen von Daten. Die Daten können externe Daten oder Daten aus anderen Relationen sein. a) Einbringen von externen Daten. Der Befehl ist : INSERT INTO Tabellenname (Attributname1, …, Attributnamek) VALUES (Wert1, …, Wertk); Beispiel. INSERT INTO Konto VALUES („Frankfurter Str.“, 1234, „Meier“, 10000); Diese Methode ist nur für kleinere Datenmengen geeignet. b) Kopieren von Daten aus anderen Relationen. Der Befehl ist: INSERT INTO Tabelle(Feld1, …) SELECT Felderliste FROM Tabelle1 [, …Tabellek] [WHERE Bedingung] [ORDER BY …]; Beispiel: INSERT INTO Konto SELECT Filiale, Kredit, Kname, 200 FROM Kredit WHERE Filiale = „Frankfurter Str.“; Bemerkung. Dieser Befehl ist wichtig auch für die Reorganisierung einer Tabelle. Bei der Reorganisation werden die Daten physisch kopiert, um in eine andere Struktur umgeformt zu werden. Eine Möglichkeit bietet sich durch das Anlegen temporärer Relationen und Umkopieren der Daten. Schematisch sind dazu folgende Schritte notwendig: • Eine temporäre Tabelle mit neuer Struktur anlegen (mit dem Befehl CREATE TABLE). • Daten in die temporäre Tabelle einbringen : INSERT INTO… SELECT…; • Relation mit der alter Struktur löschen: DROP TABLE… • Die temporäre Tabelle umbenennen : RENAME… Löschen von Daten. Die Löschoperationen in SQL sind ähnlich strukturiert wie die Anfragen. DELETE FROM Tabelle [WHERE Bedingung]; Löschoperationen sind auf eine einzige Tabelle bezogen. Obwohl bloß die Tupel aus einer Tabelle gelöscht werden, können mehrere Tabellen in der Selektionsformel erwähnt werden. Die Bedingung kann beliebig komplex sein. Eine fehlende WHERE Klausel wird als TRUE interprätiert. Beispiele : a) Löschen aller Einträge: DELETE FROM Kredit; Alle Sätze der Tabelle Kredit wird gelöscht. b)Löschen von einzelnen Sätzen: DELETE FROM Konto WHERE Kname = „Meier“; Alle Konto-Information für Meier werden gelöscht. c) Löschen mehrerer Sätze: DELETE FROM Kredit WHERE Kredit >1000 AND Kredit < 2000; Alle Kredite mit Kreditnummer zwischen 1000 und 2000 werden gelöscht. Die Sätze, die selektiert und gelöscht werden sollen, können durch eine beliebige WHERE Klausel identifiziert werden. DELETE FROM Konto WHERE Filiale IN (SELECT Filiale FROM Bank WHERE Bstadt = „Darmstadt“); Modifizieren von Daten. Nicht alle Änderungen können als einfache DELETE/INSERT Paare ausgedrückt werden. Deshalb gibt es eine andere Möglichkeit : die UPDATE Operation. Wie alle Operationen in SQL erfolgt auch die Änderung von Daten nur deskriptiv. Die UPDATE Operation erlaubt dem Anwender einzelne Feldwerte zu ändern, ohne den Rest des Sätze zu beeinflussen. Die allgemeine Form der UPDATE Operation ist folgende: UPDATE Tabelle SET Feld1 = Wert1, Feld2 =Wert2, … [WHERE Bedingung]; Die fehlende WHERE Klausel wird als wahre Bedingung gewertet. Eine WHERE Klausel im UPDATE hat das gleiche Format, wie die WHERE Klausel beim SELECT. a) Ändern aller Sätze: Erhöhe alle Kontostände um 8%. UPDATE Konto SET Saldo = Saldo *1.08; b) Ändern einzelner Sätze: In Norwegen wird ein Mensch geboren: UPDATE Land SET Einwohner = Einwohner +1 WHERE Name = „Norwegen“; c) Ändern mehrerer Sätze: Erhöhe alle Konten um den entsprechenden Zinsbetrag. Für Konten mit mehr als 100 000 EUR und 12 Monaten Anlagezeit gibt es 7%, für kleinere Beträge oder kürzere Anlagezeiten 4%. UPDATE Konto SET Saldo = Saldo *1.07 WHERE Saldo > 100000 AND Periode >=12; UPDATE Konto SET Saldo = Saldo * 1.04 WHERE Saldo <= 100000 OR Periode <12; Datenschutz Die Rolle. Nicht jedem Anwender ist es erlaubt, auf alle Tabellen uneingeschränkt zuzugreifen. Deshalb bietet SQL mittels des Befehls GRANT Recht ON Tabelle TO Benutzer; die Vergabe von Zugriffsrechten auf Tabellen an. Als mögliche Rechten sind: • ALTER - die Änderung der Definition der Tabelle • DELETE – das Löschen der Daten aus der Tabelle • INDEX – die Indizierung der Tabelle • INSERT – die Eingabe der Daten • SELECT – die Auswahl der Daten • UPDATE – die Aktualisierung der Daten • ALL – gibt dem Anwender alle Rechte Wird das obige Konstrukt um die Formulierung WITH GRANT OPTION erweitert, so darf der Benutzer dieses erworbene Recht an andere weitergeben. Wird ihm das Recht wieder entzogen, so verlieren auch diejenige das Recht, die es von ihm erhalten haben. Der Entzug von Rechten erfolgt analog zur Vergabe mit dem Befehl: REVOKE Recht ON Tabelle FROM Benutzer; Beispiele. GRANT INSERT, UPDATE ON Land TO Prinz; GRANT UPDATE(Einwohner) ON Land TO Wolf; GRANT SELECT ON Stadt TO PUBLIC; REVOKE SELECT ON Stadt FROM PUBLIC; REVOKE INSERT ON Land FROM Prinz; Transaktionsverwaltung Für die Transaktionsverarbeitung gibt es drei Befehle u. zwar: • BEGIN TRANSACTION oder DECLARE TRANSACTION • ROLLBACK [Tabelle] oder COMMIT • END TRANSACTION Mit dieser Arbeitsweise, also mit der Transaktionsvearbeitung, kann man die Änderungen in Ruhe überprüfen und danach entscheiden, ob man sie endgültig ausführt oder wieder zurücksetzen will. Es ist eine Möglichkeit, bestimmte Aktualisierungen an Datensätzen oder Datenfeldern nicht sofort auszuführen, sondern erst eine Protokolldatei zu speichern. Die Protokolldatei existiert nur so lange, bis die Transaktion abgeschlossen ist. Danach wird sie automatisch wieder gelöscht. Die obigen Befehle haben folgende Bedeutungen: • BEGIN TRANSACTION - Transaktionsverarbeitung einleiten; • ROLLBACK - vorgenommene Aktualisierungen wieder zurücksetzen; • COMMIT – die Aktualisierungen werden durchgeführt; • END TRANSACTION – Transaktion beenden. Anschließend können keine Änderungen mehr rückgängig gemacht werden. Beispiel. BEGIN TRANSACTION INSERT INTO Land(Name, Hauptstadt) VALUES („China“, „Pekin“); INSERT INTO Stadt(Name) VALUES(„Pekin“); SELECT * FROM Stadt; SELECT * FROM Land; ROLLBACK END TRANSACTION Die anderen zulässigen Befehle sind DELETE und UPDATE.