Aktionsabfragen mit SQL
Die bisherigen Abfragen veränderten am Datenbestand der Datenbank nichts, sieht man einmal davon ab, dass die Abfragen für sich in Form von Ergebnistabellen neu waren.
Im Folgenden wollen wir Abfragen kennen lernen, welche durch das Ausführen den Datenbestand der Datenbank verändern, z.B. dadurch, dass durch ihr Ausführen eine neue Tabelle entsteht.
Die Tabellenerstellungsabfrage
Wir wollen die Datensätze aller SchülerInnen mit allen, welche in Nürnberg wohnen, mit allen Attributen in eine neue Tabelle tbl_schüler_nürnberg kopieren.
Wir kennen uns mit den Grundbausteinen eines SQL-Codes schon aus und benötigen auch hier die bereits bekannten drei Anweisungen SELECT, FROM und WHERE:
SELECT tbl_schüler.* INTO tbl_schüler_nürnberg
FROM tbl_schüler, tbl_plz, tbl_ort
WHERE tbl_ort.ortsbezeichnung=“nürnberg“ and tbl_schüler.plz_nr=tbl_plz.plz_id and tbl_plz.orts_nr = tbl_ort.orts_id;
Für uns ist hier lediglich die Anweisung „INTO“ neu, welche den Befehl für die Erstellung einer neuen Tabelle gibt mit dem nachfolgenden Namen. Das „*“ in der SELECT-Anweisung steht – wir hatten das schon bei einer früheren Abfrage – für alle Attribute der Schüler-Datensätze. Um nun auch bei jedem Datensatz den Wohnort im Klartext enthalten zu haben, nehmen wir dieses Attribut aus der Tabelle tbl_ort mit in die SELECT-Anweisung auf. Der komplette Code sieht dann folgendermaßen aus:
SELECT tbl_schüler.*, tbl_ort.ortsbezeichnung INTO tbl_schüler_nürnberg
FROM tbl_schüler, tbl_plz, tbl_ort
WHERE tbl_ort.ortsbezeichnung=“nürnberg“ and tbl_schüler.plz_nr=tbl_plz.plz_id and tbl_plz.orts_nr = tbl_ort.orts_id;
Die Löschabfrage
Die in die neue Tabelle kopierten Datensätze sollen nicht redundant sein. Aus diesem Grund sollen sie aus der Tabelle tbl_schüler gelöscht werden. Auch hier kommen wieder zwei der uns bereits bekannten Anweisungen zur Anwendung: FROM und WHERE. Die erste Zeile beginnt hier jedoch mit DELETE, gefolgt von der Angabe des Ortes, von dem etwas gelöscht werden soll.
Die FROM-Anweisung ist im Fall der Löschabfrage relativ komplex: In ihr ist formuliert, dass nur diejenigen Datensätze aus tbl_schüler gelöscht werden sollen, welche über die Tabelle tbl_plz in der Tabelle tbl_ort mit einem Eintrag verbunden sind, welcher in der WHERE-Anweisung dann näher beschrieben wird („…= „nürnberg““).
DELETE tbl_schüler.*
FROM (tbl_schüler INNER JOIN tbl_plz ON tbl_schüler.plz_nr = tbl_plz.plz_id) INNER JOIN tbl_ort ON tbl_plz.orts_nr = tbl_ort.orts_id
WHERE tbl_ort.ortsbezeichnung=“nürnberg“;
Die Anfügeabfrage
In der Tabelle tbl_schüler fällt uns auf, dass die plz_nr der Schülerin Weinlein, Clementine offensichtlich falsch eingetragen wurde.


Die Langobardenstraße befindet sich in Nürnberg im PLZ-Bereich 90461, welcher in unserer Datenbank die PLZ_ID 19 zugewiesen bekommen hat. Wir ändern dies im Datensatz der Schülerin Weinlein entsprechend ab.
Auch dieser Datensatz soll nun in die Tabelle tbl_schüler_nürnberg aufgenommen werden. Würden wir erneut die Tabellenerstellungsabfrage ausführen, hätte dies zur Folge, dass die bereits bestehende Tabelle tbl_schüler_nürnberg gelöscht und dann gegen eine neue Version – mit dann eben nur einem Datensatz – ersetzt werden würde. Zwölf Datensätze wären damit verloren.
Eine Anfügeabfrage löst das Problem.
Der entsprechende SQL-Code ist dem der Tabellenerstellungsabfrage ähnlich:
INSERT INTO tbl_schüler_nürnberg
SELECT tbl_schüler.*, tbl_ort.ortsbezeichnung
FROM tbl_schüler, tbl_plz, tbl_ort
WHERE (((tbl_ort.ortsbezeichnung)=“nürnberg“) AND ((tbl_schüler.plz_nr)=[tbl_plz].[plz_id]) AND ((tbl_plz.orts_nr)=[tbl_ort].[orts_id]));
Einzig die erste Zeile enthält die für eine Anfügeabfrage unerlässliche INSERT-Anweisung, gefolgt von den uns bereits bekannten Anweisungen.
Um nun die letzte der Aktionsabfragen kennenzulernen, müssen wir die uns nun so vertraute Datenbank „Schule“ verlassen. Wir wechseln in die aus nur einer Tabelle bestehende Einkaufsdatenbank, in der wir unsere ersten Abfragen formulierten.
Die Aktualisierungsabfrage
Angenommen durch einen Eingabefehler sind die Preise der Einkäufe zu niedrig. Um dies zu berichtigen, müssen sämtliche Preis um 10 % angehoben werden. Nun wäre eine Möglichkeit, sämtliche 500 Datensätze bzw. die darin befindlichen Preis händisch auszubessern – ein enormer Aufwand!
Einfacher weil kürzer ist dies mit einer entsprechenden Abfrage zu bewerkstelligen, welche obendrein nur aus zwei SQL-Zeilen besteht:
UPDATE tbl_einkauf
SET tbl_einkauf.Preis = tbl_einkauf.Preis*1.1;
Nach der UPDATE-Anweisung folgt die Tabelle, in welcher etwas geändert i.S.v. aktualisiert werden soll. In der zweiten Zeile folgt der SET-Anweisung die Attributangabe und danach die Rechenoperation, welche hier durchgeführt werden soll.
Anmerkung: Soll die Aktualisierungsabfrage über mehrere Tabellen hinweg durchgeführt werden, so ist eine „INNER JOIN“-Anweisung (siehe Löschabfrage) in die UPDATE-Anweisung einzufügen.
Im folgenden Aufgabenteil werden Sie ausreichend Gelegenheit haben, die erworbenen Kompetenzen anhand der Datenbank einer Baumschule anzuwenden und zu vertiefen.