9.1.2 Einfügen
mehrerer Reihen
In diesem Kapitel werden die übrigen drei SQL-Anweisungen,
die zur Datenmanipulation gehören, vorgestellt. Mit diesen
Anweisungen können die Datenwerte eingefügt, geändert und
gelöscht werden. Es handelt sich um:
- INSERT,
- UPDATE und
- DELETE.
Mit der INSERT-Anweisung können Reihen oder Teile von
Reihen in einer bestehenden Tabelle eingefügt werden. Dabei
existieren zwei unterschiedliche Formen:
(1) INSERT INTO tab [(spalte_1,...)]
VALUES (wert_1,...);
(2) INSERT INTO tab
[(spalte_1,...)]
select_anw;
Mit der ersten Form der INSERT-Anweisung werden eine einzige
Reihe oder Teile einer Reihe in der Tabelle tab eingefügt.
Mit der zweiten Form werden mehrere Reihen oder Teile
mehrerer Reihen mit Hilfe einer SELECT-Anweisung gleichzeitig
in der Tabelle tab eingefügt.
Für beide Formen der INSERT-Anweisung gilt, daß jeder
eingefügte Datenwert denselben Datentyp wie die Spalte
haben muß, in der er eingefügt wird. Dabei sollen die
alphanumerischen Werte und die Datums- und Zeitangaben immer
in Apostrophen eingeschlossen werden, während man numerische
Werte ohne Apostrophe schreiben kann.
Bei der ersten Form der INSERT-Anweisung ist die explizite
Angabe der Spaltenliste optional. Falls alle Spalten einer
Tabelle eingefügt werden sollen, kann auf die Angabe der
Liste verzichtet werden.
In den folgenden vier Beispielen werden die Reihen aller
Tabellen der Beispieldatenbank eingefügt. Damit wird
gleichzeitig die Möglichkeit aufgezeigt, die Reihen einer
Datenbank zu laden.
Laden Sie alle Reihen der Tabelle arbeiten.
INSERT INTO arbeiten VALUES
(10102,'p1','Projektleiter','01-oct-1988');
INSERT INTO arbeiten VALUES
(10102,'p3','Gruppenleiter','01-jan-1989');
INSERT INTO arbeiten VALUES
(25348,'p2','Sachbearbeiter','15-feb-1988');
INSERT INTO arbeiten VALUES
(18316,'p2',NULL,'01-jun-1989');
INSERT INTO arbeiten VALUES
(29346,'p2',NULL,'15-dec-1987');
INSERT INTO arbeiten VALUES
(2581,'p3','Projektleiter','15-oct-1989');
INSERT INTO arbeiten VALUES
(9031,'p1','Gruppenleiter','15-apr-1989');
INSERT INTO arbeiten VALUES
(28559,'p1',NULL,'01-aug-1988');
INSERT INTO arbeiten VALUES
(28559,'p2','Sachbearbeiter','01-feb-1988');
INSERT INTO arbeiten VALUES
(9031,'p3','Sachbearbeiter','15-nov-1988');
INSERT INTO arbeiten VALUES
(29346,'p1','Sachbearbeiter','01-apr-1989');
Laden Sie alle Reihen der Tabelle projekt.
INSERT
INTO projekt VALUES('p1','Apollo',120000.0);
INSERT INTO projekt VALUES('p2','Gemini',95000.0);
INSERT INTO projekt
VALUES('p3','Merkur',186500.0);
Laden Sie alle Reihen der Tabelle abteilung.
INSERT
INTO abteilung VALUES('a1','Beratung','Muenchen');
INSERT INTO abteilung VALUES('a2','Diagnose','Muenchen');
INSERT INTO abteilung VALUES('a3','Freigabe','Stuttgart');
Beispiel 9.4
Laden Sie alle Reihen der Tabelle mitarbeiter.
INSERT
INTO mitarbeiter VALUES(25348,'Keller','Hans','a3');
INSERT
INTO mitarbeiter VALUES(10102,'Huber','Petra','a3');
INSERT
INTO mitarbeiter VALUES(18316,'Mueller','Gabriele','a1');
INSERT
INTO mitarbeiter VALUES(29346,'Probst','Andreas','a2');
INSERT
INTO mitarbeiter VALUES(9031,'Meier','Rainer','a2');
INSERT INTO mitarbeiter
VALUES(2581,'Kaufmann','Brigitte','a2');
INSERT
INTO mitarbeiter VALUES(28559,'Mozer','Sibille','a1');
Falls wir die Datenwerte eines neuen Mitarbeiters der Firma
einfügen wollen, kann dies auf verschiedene Weise geschehen.
INSERT INTO mitarbeiter
VALUES(15201,'Lang','Viktor',NULL);
Diese INSERT-Anweisung entspricht in ihrer Form den
INSERT-Anweisungen in den Beispielen 9.1 - 9.4. Wie aus
den Beispielen 9.1 und 9.5 ersichtlich, können NULL-Werte
durch die explizite Angabe des Schlüsselwortes NULL eingefügt
werden.
Falls nur ein Teil der Datenwerte einer Reihe eingefügt
werden soll, muß die Liste der Spalten explizit angegeben
werden. Dabei dürfen in der Liste nur solche Spalten
ausgelassen werden, die die NULL-Werte erlauben. Jeder
fehlenden Spalte in der Liste wird implizit der NULL-Wert
zugewiesen.
INSERT INTO mitarbeiter
(m_nr, m_name, m_vorname)
VALUES
(15201,'Lang','Viktor');
Beispiel 9.6 entspricht dem Beispiel 9.5. Die Spalte abt_nr
ist die einzige Spalte der Tabelle mitarbeiter, welche
NULL-Werte erlaubt. (Alle drei anderen Spalten dieser Tabelle
sind in der CREATE TABLE-Anweisung mit der Angabe NOT NULL
erstellt worden.) Falls eine Spalte, die keine NULL-Werte
erlaubt, in der Liste der Spalten ausgelassen wird, wird vom
System ein Fehler gemeldet.
Die Reihenfolge der Spalten in der INSERT-Anweisung muß
nicht unbedingt der Reihenfolge der Spalten in der CREATE
TABLE-Anweisung entsprechen. In diesem Fall ist es unbedingt
notwendig, die Liste der Spalten explizit anzugeben,
ungeachtet dessen ob eine ganze Reihe oder ein Teil einer
Reihe eingefügt werden soll.
INSERT INTO mitarbeiter (m_name,
m_vorname, abt_nr, m_nr)
VALUES
('Lotter', 'Wolfgang', 'a1', 8413);
Mit der zweiten Form der INSERT-Anweisung werden die Reihen
einer existierenden Tabelle ausgewählt und in einer anderen
Tabelle eingefügt.
Erstellen Sie die Tabelle aller Abteilungen, die in
München ihren Standort haben, und laden Sie sie mit den
entsprechenden Reihen aus der Tabelle abteilung.
CREATE
TABLE muench_abt
(abt_nr CHAR(4) NOT NULL,
abt_name CHAR(20) NOT NULL);
INSERT INTO muench_abt(abt_nr, abt_name)
SELECT abt_nr, abt_name
FROM
abteilung
WHERE stadt =
'Muenchen';
Die neue Tabelle muench_abt hat dieselben Spalten wie die
Tabelle abteilung, abgesehen von der Spalte stadt. Mit der
SELECT-Anweisung werden alle Reihen der Tabelle abteilung
ausgewählt, deren Spalte stadt den Datenwert Muenchen hat.
Diese Reihen werden anschließend in der Tabelle muench_abt
eingefügt.
Die Reihen der Tabelle muench_abt können mit der Anweisung:
SELECT * FROM muench_abt;
ausgewählt werden. Das Ergebnis dieser Anweisung ist:
abt_nr |
abt_name |
a1 |
Beratung |
a2
|
Diagnose |
(2 rows)
Erstellen Sie eine Tabelle aller Sachbearbeiter, die im
Projekt p2 arbeiten, und laden Sie sie mit den entsprechenden
Reihen aus der Tabelle arbeiten.
CREATE
TABLE sach_arb
(m_nr INTEGER NOT NULL,
pr_nr CHAR(4) NOT NULL,
einst_dat
DATE);
INSERT INTO sach_arb(m_nr,
pr_nr, einst_dat)
SELECT m_nr, pr_nr,
einst_dat
FROM arbeiten
WHERE aufgabe =
'Sachbearbeiter'
AND pr_nr = 'p2';
Die Tabelle sach_arb enthält nun folgende Reihen
m_nr |
pr_nr |
einst_dat |
25348 |
p2 |
15-feb 1989 |
28559 |
p2 |
01-feb-1989 |
(2 rows)
In den Beispielen 9.8 und 9.9 waren die beiden Tabellen
muench_abt und sach_arb leer, bevor die Reihen mit
der INSERT-Anweisung eingefügt wurden. Dies muß nicht
grundsätzlich der Fall sein. Ist eine Tabelle nicht leer,
werden die Reihen mit der INSERT-Anweisung immer angefügt.
Mit Hilfe der INSERT-Anweisung ist es möglich, die Spalte(n)
einer Tabelle zu löschen. Das folgende Beispiel zeigt diese
Anwendung der INSERT-Anweisung, die für INGRES wichtig ist,
weil INGRES-SQL die -nderung des Tabellenschemas mit Hilfe
der ALTER TABLE-Anweisung nicht unterstützt.
Löschen Sie die Spalte einst_dat in der Tabelle arbeiten.
CREATE
TABLE arb_hilf
(m_nr INTEGER NOT NULL,
pr_nr CHAR(4) NOT NULL,
aufgabe CHAR(15));
INSERT INTO arb_hilf(m_nr, pr_nr,
aufgabe)
SELECT m_nr, pr_nr, aufgabe
FROM arbeiten;
DROP TABLE arbeiten;
CREATE
TABLE arbeiten
(m_nr INTEGER NOT NULL,
pr_nr CHAR(4) NOT NULL,
aufgabe CHAR(15));
INSERT INTO arbeiten
SELECT *
FROM arb_hilf;
DROP
TABLE arb_hilf;
In Beispiel 9.10 wurde zunächst eine Hilfstabelle arb_hilf
erstellt, die, abgesehen von der zu löschenden Spalte
einst_dat mit der Tabelle arbeiten identisch ist. Mit der
ersten INSERT-Anweisung werden die Datenwerte aus der Tabelle
arbeiten in der Tabelle arb_hilf eingefügt. Die Tabelle
arbeiten wird danach gelöscht und noch einmal erstellt,
nun jedoch ohne die Spalte einst_dat. Am Ende werden die
Datenwerte aus der Hilfstabelle in der neuerstellten Tabelle
arbeiten eingefügt, und die Hilfstabelle wird gelöscht.
Das Einfügen der Reihen eines Views kann nicht
uneingeschränkt durchgeführt werden. Diesem Thema ist ein
Abschnitt des Kapitels 10 gewidmet.
Die UPDATE-Anweisung ändert die Datenwerte der Reihen einer
Tabelle. Diese Anweisung hat folgende Form:
UPDATE tab
SET spalte_1=ausdr_1 [,spalte_2=ausdr_2,...]
[WHERE bedingung];
Bei der UPDATE-Anweisung werden die Reihen der Tabelle
tab auf Grund der Bedingung in der WHERE-Klausel zunächst
ausgewählt. Danach wird der Spalte spalte_1 der Wert
ausdr_1 zugewiesen. Falls mehrere Spalten in der SET-Klausel
angegeben sind, wird jeder von ihnen der entsprechende Wert
zugewiesen. ausdr_1 kann eine Konstante oder ein Ausdruck
sein. Die Angabe der WHERE-Klausel ist optional. Falls sie
ausgelassen wird, werden alle Reihen der Tabelle geändert.
Mit einer UPDATE-Anweisung kann nur eine Tabelle geändert
werden.
Das -ndern der Reihen eines Views entspricht dem -ndern der
Reihen einer Basistabelle. Im Unterschied zu Basistabellen
ist das -ndern der Reihen bei Views nur eingeschränkt
möglich. In Kapitel 11 wird dies ausführlich behandelt.
-ndern Sie die Aufgabe des Mitarbeiters mit der
Personalnummer 18316 im Projekt p2. Er soll Gruppenleiter
dieses Projektes werden.
UPDATE arbeiten
SET aufgabe =
'Gruppenleiter'
WHERE
m_nr = 18316
AND pr_nr = 'p2';
Mit dieser UPDATE-Anweisung wird nur eine Reihe der Tabelle
arbeiten geändert, weil die Kombination beider Bedingungen
mit den Spalten m_nr und pr_nr immer nur eine Reihe als
Ergebnis liefert. Im obigen Beispiel wurde die Aufgabe
des Mitarbeiters, die bis dahin unbekannt war (NULL-Wert),
definiert.
Im nächsten Beispiel wird den Datenwerten einer Spalte ein
Ausdruck zugewiesen.
Die Finanzmittel aller Projekte sollen geändert und in
Schweizer Franken dargestellt werden. (Der augenblickliche
Währungskurs soll bei 0,89 SFR für 1 DM sein.)
UPDATE projekt
SET mittel = mittel *
0.89;
In Beispiel 9.12 werden alle Reihen der Tabelle projekt
geändert, weil die WHERE-Klausel fehlt. Die geänderten Reihen
der Tabelle projekt können mit der folgenden Anweisung
SELECT *
FROM projekt
ausgewählt werden. Das Ergebnis dieser Anweisung ist
pr_nr |
pr_name |
mittel |
p1 |
Apollo |
106800.000 |
p2 |
Gemini |
84550.000 |
p3 |
Merkur |
165985.000 |
(3 rows)
Die Aufgaben von Frau Huber sollen, wegen längerer Krankheit,
in allen Projekten auf NULL gesetzt werden.
UPDATE arbeiten
SET aufgabe = NULL
WHERE
m_nr =
(SELECT m_nr
FROM mitarbeiter
WHERE m_name = 'Huber');
Im obigen Beispiel beinhaltet die WHERE-Klausel der
UPDATEAnweisung
eine Unterabfrage. Das Ergebnis dieser Unterabfrage
darf in diesem Fall nur einen Datenwert liefern.
Mit der DELETE-Anweisung werden Reihen aus einer Tabelle
gelöscht. Die allgemeine Form dieser Anweisung ist:
DELETE FROM tab
[WHERE bedingung];
Die WHERE-Klausel liefert die Reihen, die aus einer Tabelle
gelöscht werden. Die explizite Angabe von Spalten in einer
DELETE-Anweisung ist nicht notwendig, weil alle Datenwerte
einer oder mehrerer Reihen gelöscht werden.
Löschen Sie die Datenwerte der Gruppenleiter aller Projekte.
DELETE FROM arbeiten
WHERE aufgabe =
'Gruppenleiter';
Die WHERE-Klausel in der DELETE-Anweisung kann, wie bei der
UPDATE-Anweisung auch, eine Unterabfrage enthalten.
Die Mitarbeiterin namens Mozer scheidet aus der Firma aus.
Löschen Sie zunächst alle Reihen in der Tabelle arbeiten,
die diese Mitarbeiterin betreffen, und danach auch die
entsprechende Reihe der Tabelle mitarbeiter.
DELETE FROM arbeiten
WHERE m_nr =
(SELECT m_nr
FROM
mitarbeiter
WHERE m_name =
'Mozer');
DELETE FROM mitarbeiter
WHERE m_name =
'Mozer';
Die Angabe der WHERE-Klausel in der DELETE-Anweisung ist
optional. Ist diese Klausel nicht angegeben, werden alle
Reihen einer Tabelle gelöscht.
Löschen Sie alle Reihen der Tabelle arbeiten.
DELETE FROM arbeiten;
Das Löschen der Reihen eines Views kann nur mit
Einschränkungen ausgeführt werden. In Kapitel 11 wird das
Löschen der Reihen eines Views beschrieben.
Hinweis.
Die DELETE-Anweisung unterscheidet sich von der DROP
TABLEAnweisung
dadurch, daß sie alle Reihen einer Tabelle löscht,
während die DROP TABLE-Anweisung sowohl alle Reihen als auch
die Tabellen- und Spaltenspezifikation einer Tabelle löscht.
A.9.1 Erstellen Sie eine neue Tabelle aller Mitarbeiter, die in
den Projekten a1 und a2 arbeiten, und laden Sie sie mit
den entsprechenden Reihen der Tabelle mitarbeiter.
A.9.2 Erstellen Sie eine neue Tabelle aller Mitarbeiter, die im
Jahr 1989 eingestellt worden sind, und laden Sie sie mit
den entsprechenden Reihen aus der Tabelle mitarbeiter.
A.9.3 Ändern Sie die Aufgabe aller Gruppenleiter in Projekt
p1. Sie sollen ab sofort als Sachbearbeiter tätig sein.
A.9.4 Die Mittel aller Projekte sind bis auf weiteres nicht
festgelegt. Weisen Sie den Mitteln den NULL-Wert zu.
A.9.5 Ändern Sie die Aufgabe der Mitarbeiterin mit der
Personalnummer 28559. Sie soll ab sofort in allen
Projekten Gruppenleiterin werden.
A.9.6 Löschen Sie alle Reihen der Tabelle abteilung, deren
Standort München ist.
A.9.7 Das Projekt p3 ist beendet worden. Löschen Sie zunächst
alle Daten der Mitarbeiter in der Tabelle mitarbeiter,
die in diesem Projekt gearbeitet haben, und danach auch
die entsprechende Reihe der Tabelle projekt.