Einführung in SQL: DML (2) - Daten speichern
Aus Wikibooks
Dieser Teilbereich der Data Manipulation Language (DML) behandelt die Befehle, mit denen die Inhalte der Datenbank geändert werden: Neuaufnahme, Änderung, Löschung.
Bitte beachten Sie, dass mit den Befehlen INSERT, UPDATE, DELETE (fast) immer nur Daten genau einer Tabelle bearbeitet werden können – anders als beim SELECT-Befehl, der Daten mehrerer Tabellen zusammenfassen kann.
Inhaltsverzeichnis |
[Bearbeiten] INSERT – Daten einfügen
Der INSERT-Befehl dient dem Erstellen von neuen Datensätzen. Es gibt ihn in zwei Versionen – zum einen durch die Angabe einzelner Werte, zum anderen mit Hilfe eines SELECT-Befehls.
In beiden Versionen müssen die Datentypen der Werte zu den Datentypen der Spalten passen. Man sollte nicht versuchen, einer Spalte, die eine Zahl erwartet, eine Zeichenkette zuzuweisen. Man wird nur selten das Ergebnis erhalten, welches man erwartet. Das Kapitel Funktionen erläutert im Abschnitt Konvertierungen Möglichkeiten, wie Werte implizit (also automatisch) oder explizit durch CAST oder CONVERT angepasst werden können.
[Bearbeiten] Einzeln mit VALUES
Wenn ein einzelner Datensatz durch die Angabe seiner Werte gespeichert werden soll, gilt folgende Syntax:
INSERT INTO <tabellenname>
[ ( <spaltenliste> ) ]
VALUES ( <werteliste> )
;
Zu diesem Befehl gehören folgende Angaben:
- INSERT als Name des Befehls, INTO als feststehender Begriff
- <Tabellenname> als Name der Tabelle, die diesen Datensatz erhalten soll
- in Klammern ( ) gesetzt eine Liste von Spalten (Feldnamen), denen Werte zugewiesen werden
- der Begriff VALUES als Hinweis darauf, dass einzelne Werte angegeben werden
- in Klammern ( ) gesetzt eine Liste von Werten, die in den entsprechenden Spalten gespeichert werden sollen
Wenn eine Liste von Spalten fehlt, bedeutet das, dass alle Spalten dieser Tabelle in der Reihenfolge der Struktur mit Werten versehen werden müssen.
So wird (wie im Skript der Beispieldatenbank) ein Eintrag in der Tabelle Mitarbeiter gespeichert:
INSERT INTO Mitarbeiter ( Personalnummer, Name, Vorname, Geburtsdatum, Telefon, Email, Raum, Ist_Leiter, Abteilung_ID ) VALUES ( '20002', 'Schmitz', 'Michael', '1959-08-25', '0231/5556187', 'michael.schmitz@unserefirma.de', '212', 'N', 2);
Wenn Sie diesen Befehl mit der Tabellenstruktur vergleichen, werden Sie feststellen:
- Die Spalte ID fehlt. Dieser Wert wird von der Datenbank automatisch vergeben.
- Die Spalte Mobil fehlt. In dieser Spalte wird folglich ein NULL-Wert gespeichert.
In der Beschreibung der Beispieldatenbank werden sehr viele Spalten als "Pflicht" festgelegt. Folgender Befehl wird deshalb zurückgewiesen:
INSERT INTO Mitarbeiter ( Personalnummer, Name, Vorname, Ist_Leiter, Abteilung_ID ) VALUES ( '17999', 'Liebich', 'Andrea', 'N', 17);
validation error for column GEBURTSDATUM, value "*** null ***".
Die Spalte Geburtsdatum darf laut Definition nicht NULL sein; eine Angabe fehlt in diesem Befehl; das wird als NULL interpretiert, also mit einer Fehlermeldung quittiert.
[Bearbeiten] Mengen mit SELECT
Wenn eine Menge von Datensätzen mit Hilfe eines SELECT-Befehls gespeichert werden soll, gilt folgende Syntax:
INSERT INTO <tabellenname>
[ ( <spaltenliste> ) ]
SELECT <select-Ausdruck>
;
Zu diesem Befehl gehören die folgenden Angaben:
- INSERT INTO <Tabellenname> (wie oben)
- in Klammern ( ) gesetzt eine Liste von Spalten (Feldnamen), sofern vorgesehen
- dazu ein vollständiger SELECT-Befehl, mit dem die passenden Inhalte geliefert werden
Da ein SELECT-Befehl auch ohne Bezug auf eine Tabelle nur mit konstanten Werten möglich ist, kann das obige Beispiel auch so formuliert werden:
INSERT INTO Mitarbeiter ( Personalnummer, Name, Vorname, Geburtsdatum, Telefon, Email, Raum, Ist_Leiter, Abteilung_ID ) SELECT '20002', 'Schmitz', 'Michael', '1959-08-25', '0231/5556187', 'michael.schmitz@unserefirma.de', '212', 'N', 2 /* from rdb%database (bei Firebird) */ ;
Hinweis: Firebird kennt diese Art des SELECT-Befehls nicht; dort ist die als Kommentar eingefügte FROM-Klausel erforderlich.
Wichtig ist diese Art des INSERT-Befehls, wenn neue Datensätze aus vorhandenen anderen Daten abgeleitet werden wie im Skript der Beispieldatenbank:
Für jeden Abteilungsleiter aus der Tabelle Mitarbeiter wird ein Eintrag in der Tabelle Dienstwagen gespeichert:
INSERT INTO Dienstwagen ( Kennzeichen, Farbe, Fahrzeugtyp_ID, Mitarbeiter_ID ) SELECT 'DO-WB 42' || Abteilung_ID, 'elfenbein', 14, ID FROM Mitarbeiter WHERE Ist_Leiter = 'J';
Die Spalte ID wird automatisch zugewiesen. Alle anderen Spalten erhalten ausdrücklich Werte:
- Farbe und Fahrzeugtyp als Konstante
- dazu natürlich die ID des Mitarbeiters, dem der Dienstwagen zugeordnet wird
- und ein Kfz-Kennzeichen, das aus einem konstanten Teil mit der ID der Abteilung zusammengesetzt wird
[Bearbeiten] UPDATE – Daten ändern
Der UPDATE-Befehl dient zum Ändern einer Menge von Datensätzen in einer Tabelle:
UPDATE <Tabellenname>
SET <Feldänderungen>
[WHERE <Bedingungsliste>];
Jede Änderung eines Feldes ist so einzutragen:
<Feldname> = <Wert>,
Zu diesem Befehl gehören die folgenden Angaben:
- UPDATE als Name des Befehls
- <Tabellenname> als Name der Tabelle, in der diese Datenmenge geändert werden soll
- SET als Anfang der Liste von Änderungen
- <Feldname> als Name der Spalte, die einen neuen Inhalt erhalten soll, dazu das Gleichheitszeichen und der <Wert> als neuer Inhalt
- ein Komma als Hinweis, dass ein weiteres Feld zu ändern ist; vor der WHERE-Klausel oder dem abschließenden Semikolon muss das Komma entfallen
- die WHERE-Klausel mit Bedingungen, welche Datensätze zu ändern sind: einer oder eine bestimmte Menge
Die Struktur der WHERE-Klausel ist identisch mit derjenigen beim SELECT-Befehl. Wenn alle Datensätze geändert werden sollen, kann die WHERE-Bedingung entfallen; aber beachten Sie unbedingt:
- Ohne WHERE-Bedingung wird wirklich und unwiderruflich alles geändert.
An den Beispielen ist zu sehen, dass die Änderung aller Datensätze nur selten sinnvoll ist und meistens mit WHERE-Bedingung gearbeitet wird.
Wie beim INSERT-Befehl muss der Datentyp eines Wertes zum Datentyp der Spalte passen.
Beispiele:
Korrigiere die Schreibweise des Namens beim Mitarbeiter mit der Personalnummer 20001.
Ändere nach einer Eingemeindung PLZ und Ortsname für alle betroffenen Adressen.
Erhöhe bei allen Schadensfällen die Schadenshöhe um 10% (das ist natürlich keine sinnvolle Maßnahme):
Berichtige das Geburtsdatum für einen bestimmten Versicherungsnehmer:
UPDATE Versicherungsnehmer SET Geburtsdatum = '14.03.1963' WHERE Name = 'Zenep' AND Geburtsdatum = '13.02.1963';
0 row(s) affected.
Nanu, keine Zeilen wurden geändert? Bei diesem Befehl wurde zur Kontrolle, welcher Datensatz geändert werden sollte, nicht nur der Nachname, sondern auch das bisher notierte Geburtsdatum angegeben – und dieses war falsch.
Daran ist zu sehen, dass der UPDATE-Befehl tatsächlich eine Menge von Datensätzen ändert: je nach WHERE-Klausel null, einen, mehrere oder alle Zeilen der Tabelle.
[Bearbeiten] DELETE – Daten löschen
Der DELETE-Befehl dient zum Löschen einer Menge von Datensätzen in einer Tabelle:
DELETE FROM <Tabellenname>
[ WHERE <Bedingungsliste> ] ;
Zu diesem Befehl gehören folgende Angaben:
- DELETE als Name des Befehls, FROM als feststehender Begriff
- <Tabellenname> als Name der Tabelle, aus der diese Datenmenge entfernt werden soll
- die WHERE-Klausel mit Bedingungen, welche Datensätze zu löschen sind: einer oder eine bestimmte Menge
Die Struktur der WHERE-Klausel ist identisch mit derjenigen beim SELECT-Befehl. Wenn alle Datensätze gelöscht werden sollen, kann die WHERE-Bedingung entfallen; aber beachten Sie unbedingt:
- Ohne WHERE-Bedingung wird wirklich und unwiderruflich immer alles gelöscht.
Beispiele:
Der Mitarbeiter mit der Personalnummer 20001 ist ausgeschieden.
Die Abteilung 1 wurde ausgelagert, alle Mitarbeiter gehören nicht mehr zum Unternehmen.
Dies leert den gesamten Inhalt der Tabelle, aber die Tabelle selbst bleibt mit ihrer Struktur erhalten.
Achtung: Dies löscht ohne weitere Rückfrage alle gespeicherten Schadensfälle. Ein solcher Befehl sollte unbedingt nur nach einer vorherigen Datensicherung ausgeführt werden. Auch der Versuch ist "strafbar" und führt zum sofortigen Datenverlust.
[Bearbeiten] TRUNCATE – Tabelle leeren
Wenn Sie entgegen den oben genannten Hinweisen wirklich alle Datensätze einer Tabelle löschen wollen, können Sie (soweit vorhanden) anstelle von DELETE den TRUNCATE-Befehl benutzen. Damit werden (ohne Verbindung mit WHERE) immer alle Datensätze gelöscht; dies geschieht schneller und einfacher, weil auf das interne Änderungsprotokoll der Datenbank verzichtet wird.
[Bearbeiten] Zusammenfassung
In diesem Kapitel lernten wir die SQL-Befehle kennen, mit denen der Datenbestand geändert wird:
- Mit INSERT + VALUES wird ein einzelner Datensatz eingefügt.
- Mit INSERT + SELECT wird eine Menge von Datensätzen mit Hilfe einer Abfrage eingefügt.
- Mit UPDATE wird eine Menge von Datensätzen geändert; die Menge wird durch WHERE festgelegt.
- Mit DELETE wird eine Menge von Datensätzen gelöscht; die Menge wird durch WHERE festgelegt.
- Mit TRUNCATE werden alle Datensätze einer Tabelle gelöscht.
Die WHERE-Bedingungen sind hier besonders wichtig, damit keine falschen Speicherungen erfolgen.