8. Daten manipulieren

Ziele

Anweisungen der Datenmanipulation

Die Anweisung INSERT

Die Anweisung UPDATE

Die Anweisung DELETE

Daten importieren und exportieren

Zusammenfassung

Fragen & Antworten

Workshop



Ziele

Im Mittelpunkt des heutigen Tages steht die Manipulation von Daten. Insbesondere erfahren Sie ...



Anweisungen der Datenmanipulation

Bis jetzt haben Sie gelernt, wie man Daten nach den verschiedenartigsten Auswahlkriterien aus einer Datenbank abruft. Diese Daten lassen sich dann in einer Anwendung weiterverarbeiten. Woche 1 hat sich auf das Abrufen von Daten konzentriert. Vielleicht ist aber bei Ihnen die Frage aufgetaucht, wie die Daten überhaupt in die Datenbank gelangen. Außerdem ist zu klären, was mit den bearbeiteten Daten geschehen soll. Heute behandeln wir drei SQL-Anweisungen, mit denen man Daten innerhalb einer Datenbanktabelle manipulieren kann. Diese drei Anweisungen lauten:


Möglicherweise haben Sie Ihre Daten in der Vergangenheit mit einem PC-basierten Produkt wie Access, dBASE IV oder FoxPro eingegeben. Zum Lieferumfang dieser Produkte gehören ausgezeichnete Werkzeuge zum Eingeben, Bearbeiten und Löschen von Datensätzen in Datenbanken. SQL stellt Anweisungen zur Datenmanipulation bereit, weil man diese Sprache hauptsächlich in Anwendungen einsetzt, die dem Benutzer die Bearbeitung der Daten mit den Werkzeugen der Anwendung selbst erlauben. Der SQL-Programmierer muß in der Lage sein, die Daten per SQL an die Datenbank zurückzugeben. Darüber hinaus sind die meisten größeren Datenbanksysteme nicht auf den Datenbankentwickler oder Programmierer ausgerichtet, sondern für den Einsatz in Mehrbenutzerumgebungen mit hohem Datenaufkommen konzipiert. Die Entwurfsarbeit konzentriert sich daher auf den Abfrageoptimierer und die Engines zum Abrufen der Daten.


Die meisten kommerziellen relationalen Datenbanksysteme bieten Werkzeuge für das Importieren und Exportieren von Daten. Normalerweise sind diese Daten in Textdateien mit Trennzeichen gespeichert. Oftmals wird eine Formatdatei mit Angaben zur importierenden Tabelle angelegt. Werkzeuge wie SQL*Loader von Oracle, bcp (bulk copy) von SQL Server und die Befehle Importieren/Exportieren in Microsoft Access kommen am Ende des heutigen Tages zur Sprache.


Die Beispiele dieser Lektion entstanden mit Personal Oracle8. Beachten Sie bitte kleinere Unterschiede in der Erscheinungsweise der Befehle und der Datenausgabe bei anderen Implementierungen.


Die Anweisung INSERT

Mit der Anweisung INSERT lassen sich Daten in eine Datenbank eingeben. Die Anweisung existiert in zwei Varianten:


INSERT...VALUES


und


INSERT...SELECT



Die Anweisung INSERT...VALUES

Die Anweisung INSERT...VALUES trägt Daten in eine Tabelle datensatzweise ein. Diese Anweisung bietet sich für kleinere Operationen an, die nur wenige Datensätze betreffen. Die Syntax der Anweisung lautet:


Im grundlegenden Format fügt die Anweisung INSERT...VALUES einen Datensatz in eine Tabelle ein und verwendet dabei die angegebenen Spalten mit den entsprechenden Werten. Beim Einfügen von Daten in eine Tabelle mit der Anweisung INSERT...VALUES sind drei Regeln zu beachten:


Beispiel 8.1

Nehmen wir eine Tabelle SAMMLUNG an, die Ihre liebgewordenen Sammlerstücke auflistet. Den Inhalt der Tabelle zeigen Sie mit der folgenden Anweisung an:


SQL> SELECT * FROM SAMMLUNG;


Als Ergebnis erhalten Sie:


STUECK WERT BEMERKUNGEN
-------------------- --------- ----------------------------------------
WEGWEISER 300 FEHLT JETZT IN ADORF
MALIBU BARBIE 150 REPARIEREN
R2D2-MODELL 850 STEUERUNG DEFEKT
LOCKE VON SUSI 1 KAHLE STELLE NOCH NICHT BEMERKT


Wenn Sie einen neuen Datensatz in diese Tabelle einfügen möchten, schreiben Sie zum Beispiel:


SQL> INSERT INTO SAMMLUNG
2 (STUECK, WERT, BEMERKUNGEN)
3 VALUES ('SCHUMI-CAP',40.00,'IN SPA GEFUNDEN');

1 Zeile wurde erstellt.


Mit einer einfachen SELECT-Anweisung überzeugen Sie sich von der korrekten Einfügung:


SQL> SELECT * FROM SAMMLUNG;

STUECK WERT BEMERKUNGEN
-------------------- --------- ----------------------------------------
WEGWEISER 300 FEHLT JETZT IN ADORF
MALIBU BARBIE 150 REPARIEREN
R2D2-MODELL 850 STEUERUNG DEFEKT
LOCKE VON SUSI 1 KAHLE STELLE NOCH NICHT BEMERKT
SCHUMI-CAP 40 IN SPA GEFUNDEN

5 Zeilen ausgewählt.


In der INSERT-Anweisung sind Spaltennamen nicht erforderlich. Gibt man sie nicht an, trägt SQL die Werte nacheinander entsprechend der Spaltennummer ein - den ersten Wert in die erste Spalte, den zweiten in die zweite Spalte usw.

Beispiel 8.2

Die folgende Anweisung fügt die Werte entsprechend Beispiel 8.1 ohne Angabe der Spaltennamen in die Tabelle ein:


SQL> INSERT INTO SAMMLUNG VALUES
2 ('KETTE',1000.00,'WIRD IRGENDWANN WERTVOLL');

1 Zeile wurde erstellt.


Per SELECT-Anweisung wie in Beispiel 8.1 können Sie sich vom ordnungsgemäßen Einfügen überzeugen:

SQL> SELECT * FROM SAMMLUNG;


STUECK WERT BEMERKUNGEN
-------------------- --------- ----------------------------------------
WEGWEISER 300 FEHLT JETZT IN ADORF
MALIBU BARBIE 150 REPARIEREN
R2D2-MODELL 850 STEUERUNG DEFEKT
LOCKE VON SUSI 1 KAHLE STELLE NOCH NICHT BEMERKT
SCHUMI-CAP 40 IN SPA GEFUNDEN
KETTE 1000 WIRD IRGENDWANN WERTVOLL

6 Zeilen ausgewählt.



NULL-Werte einfügen

Am neunten Tag lernen Sie, wie man Tabellen mit der SQL-Anweisung CREATE TABLE erstellt. Momentan brauchen Sie nur zu wissen, daß man eine Spalte mit verschiedenen Einschränkungen belegen kann. Dazu gehört unter anderem, ob die Spalte NULL-Werte enthalten darf. NULL kennzeichnet einen leeren Wert, der weder 0 bei einer ganzen Zahl noch einem Leerzeichen bei einem String entspricht. Statt dessen existieren für die Spalte dieses Datensatzes überhaupt keine Daten. Ist eine Spalte als NOT NULL definiert (das heißt, diese Spalte darf keinen NULL-Wert enthalten), muß man bei einer INSERT-Anweisung einen Wert für diese Spalte einfügen. Wenn man diese Regel verletzt, wird die INSERT-Operation abgebrochen und eine entsprechende Fehlermeldung ausgegeben.


Für eine Leerspalte kann man Leerzeichen einfügen, die allerdings einen echten Wert darstellen. NULL bedeutet dagegen, daß die betreffende Spalte nichts enthält.

SQL> INSERT INTO SAMMLUNG VALUES
2 ('HINKELSTEIN',50.00, ' ');


1 Zeile wurde erstellt.


Mit der Zeichenfolge ' ' statt NULL fügt man ein Leerzeichen in die Tabelle SAMMLUNG ein. Das Leerzeichen läßt sich dann auswählen.

SQL> SELECT * FROM SAMMLUNG
2 WHERE BEMERKUNGEN = ' ';

STUECK WERT BEMERKUNGEN
-------------------- --------- ----------------------------------------
HINKELSTEIN 50

1 Zeile wurde ausgewählt.


Die Ergebnisspalte bei der Ausgabe von Zeichenfeldern läßt äußerlich keinen Unterschied zwischen einem bloßen Leerzeichen und dem Wert NULL erkennen.

Nehmen wir an, daß die Spalte BEMERKUNGEN in der obigen Tabelle als NOT NULL definiert ist. Die Anweisung


SQL> INSERT INTO SAMMLUNG
2 VALUES('HINKELSTEIN',50.00,NULL);


produziert den folgenden Fehler:


INSERT INTO SAMMLUNG
*
FEHLER in Zeile 1:
ORA-01400: Einfügen von NULL in ("PERKINS"."SAMMLUNG"."BEMERKUNGEN") nicht möglich


Beachten Sie die Syntax. Während numerische Datentypen und NULL keine Apostrophe erfordern, sind Apostrophe bei Zeichentypen Pflicht.


Eindeutige Werte einfügen

In vielen Datenbank-Managementsystemen lassen sich Spalten mit dem Attribut UNIQUE erzeugen. Dieses Attribut bedeutet, daß die Werte der betreffenden Spalte innerhalb der Tabelle absolut eindeutig sein müssen und nicht mehrfach auftreten dürfen. Diese Einschränkung kann zu Problemen führen, wenn man Werte in einer existierenden Tabelle einfügt oder aktualisiert. Das folgende Beispiel zeigt das anhand eines Austauschs von Werten:


SQL> INSERT INTO SAMMLUNG VALUES('KETTE',50,'NOCH EINE KETTE');


INSERT INTO SAMMLUNG VALUES('KETTE',50,'NOCH EINE KETTE')
*
FEHLER in Zeile 1:
ORA-00001: Verstoß gegen Eindeutigkeit, Regel (SYSTEM.SYS_C00680)


In diesem Beispiel haben Sie versucht, ein anderes Sammlerstück namens KETTE in die Tabelle SAMMLUNG einzufügen. Da beim Erstellen der Tabelle die Spalte STUECK für eindeutige Werte festgelegt wurde, erhält man den Fehler zurück. ANSI SQL bietet keine Lösung für dieses Problem. Allerdings schließen verschiedene kommerzielle Implementierungen Erweiterungen ein, bei denen man etwa folgendes schreiben kann:

IF NOT EXISTS (SELECT * FROM SAMMLUNG WHERE STUECK = 'KETTE'
INSERT INTO SAMMLUNG VALUES('KETTE', 50, 'NOCH EINE KETTE')


Das angeführte Beispiel wird im System von Sybase unterstützt.


Eine normalisierte Tabelle sollte über ein eindeutiges Feld - ein sogenanntes Schlüsselfeld - verfügen. Über dieses Feld lassen sich Daten zwischen Tabellen verknüpfen. Außerdem verbessert es oft die Geschwindigkeit der Abfragen bei der Verwendung von Indizes. (Siehe dazu Tag 10.)


Die folgende INSERT-Anweisung fügt einen neuen Mitarbeiter in eine Tabelle ein:

SQL> insert into mitarbeiter_tbl values
('300500177', 'SMITHH', 'JOHN');

1 Zeile wurde erstellt.


Nach Drücken von (Enter) bemerken Sie, daß Sie SMITH falsch geschrieben haben. Das ist nicht weiter schlimm! Sie müssen lediglich den ROLLBACK-Befehl ausführen, und die Zeile wird nicht eingefügt. Näheres zum ROLLBACK-Befehl finden Sie in Lektion 11.


Die Anweisung INSERT...SELECT

Die Anweisung INSERT...VALUES eignet sich durchaus für das Einfügen einzelner Datensätze in eine Datenbanktabelle, aber würden Sie mit dieser Anweisung 25000 Datensätze in eine Tabelle einfügen wollen? Für derartige Fälle bietet sich die Anweisung INSERT...SELECT an. Der Programmierer kann damit Informationen aus einer Tabelle oder einer Gruppe von Tabellen in eine andere Tabelle kopieren. Diese Anweisung werden Sie in verschiedenen Situationen verwenden. Aus Leistungsgründen legt man Nachschlagetabellen an. Derartige Tabellen enthalten Daten, die über mehrere Tabellen in mehreren Datenbanken verteilt vorliegen. Da Verknüpfungen über mehrere Tabellen langsamer verarbeitet werden als einfache Abfragen, läßt sich eine SELECT-Abfrage bezüglich einer Nachschlagetabelle wesentlich schneller ausführen, als eine lange und komplizierte Verknüpfungsabfrage. In Client/Server-Umgebungen speichert man Nachschlagetabellen häufig auf den Client-Maschinen, um die Netzbelastung zu verringern.


Viele Datenbanksysteme unterstützen auch temporäre Tabellen. (Siehe dazu Tag 14.) Temporäre Tabellen existieren nur für die Dauer der Datenbankverbindung und werden beim Trennen der Verbindung gelöscht. Die Anweisung INSERT...SELECT kann die Ausgabe einer SELECT-Anweisung übernehmen und diese Werte in eine temporäre Tabelle einfügen.


Dazu ein Beispiel:


SQL> insert into tmp_tbl
2 select * from tabelle;


19.999 Zeilen erstellt.


Das Beispiel wählt alle Zeilen in tabelle aus und fügt sie in die Tabelle tmp_tbl ein.

Da nicht alle Datenbank-Managementsysteme temporäre Tabellen unterstützen, sollten Sie sich anhand der Dokumentation zum jeweiligen System darüber informieren. Kapitel 14 geht näher auf dieses Thema ein.

Die Syntax der Anweisung INSERT...SELECT sieht folgendermaßen aus:


Hier wird praktisch die Ausgabe einer normalen SELECT-Abfrage in eine andere Datenbanktabelle eingegeben. Die auf die Anweisung INSERT...VALUES zutreffenden Regeln gelten auch für die Anweisung INSERT...SELECT. Um den Inhalt der Tabelle SAMMLUNG in eine neue Tabelle namens INVENTAR zu kopieren, führen Sie die Anweisungsgruppe in Beispiel 8.3 aus.


Beispiel 8.3

Das folgende Beispiel erzeugt zunächst eine neue Tabelle INVENTAR.


SQL> CREATE TABLE INVENTAR
2 (STUECK CHAR(20),
3 KOSTEN NUMBER,
4 RAUM CHAR(20),
5 BEMERKUNGEN CHAR(40));


Tabelle wurde angelegt.


Die nachstehende INSERT-Anweisung füllt die neue Tabelle INVENTAR mit den Daten aus SAMMLUNG.


SQL> INSERT INTO INVENTAR (STUECK, KOSTEN, BEMERKUNGEN)
2 SELECT STUECK, WERT, BEMERKUNGEN
3 FROM SAMMLUNG;

6 Zeilen wurden erstellt.


Mit der folgenden SELECT-Anweisung läßt sich überprüfen, ob die INSERT-Operation erfolgreich war:


SQL> SELECT * FROM INVENTAR;

STUECK KOSTEN RAUM BEMERKUNGEN
-------------------- --------- ----------------- ------------------------------
WEGWEISER 300 FEHLT JETZT IN ADORF
MALIBU BARBIE 150 REPARIEREN
R2D2-MODELL 850 STEUERUNG DEFEKT
LOCKE VON SUSI 1 KAHLE STELLE NOCH NICHT BEMERKT
SCHUMI-CAP 40 IN SPA GEFUNDEN
KETTE 1000 WIRD IRGENDWANN WERTVOLL

6 Zeilen ausgewählt.


Die Daten scheinen in der Tabelle vorzuliegen; allerdings ist die Transaktion erst nach Ausführen eines COMMIT-Befehls abgeschlossen. Die Transaktion läßt sich durch den Befehl COMMIT oder durch einfaches Beenden bestätigen. Tag 11 enthält weitere Details zum COMMIT-Befehl.

In diesem Beispiel haben Sie die Daten aus der Tabelle SAMMLUNG mit geringem Aufwand in die neue Tabelle INVENTAR übertragen.

Bei der Anweisung INSERT...SELECT sind einige neue Regeln zu beachten:


Ein weiterer Einsatzfall der Anweisung INSERT...SELECT ist die Sicherung einer Tabelle, wenn man diese löschen, leeren oder neu aufbauen möchte. Dazu muß man alle Daten aus der Originaltabelle auswählen und in eine neu anzulegende temporäre Tabelle einfügen. Dazu folgendes Beispiel:


SQL> insert into sicherungstabelle
2 select * from originaltabelle;


Nun können Sie mit ruhigem Gewissen Änderungen an der Originaltabelle vornehmen.


Nahezu alle geschäftlichen Anwendungen speichern Firmendaten in mehreren verschiedenen Datenbankformaten. Vom Anwendungsprogrammierer wird oft erwartet, daß er diese Formate konvertiert. Weiter hinten in dieser Lektion erfahren Sie, wie man Daten mit einem anderen Datenbankformat in eine Tabelle einfügt.


Die Anweisung UPDATE

Mit der Anweisung UPDATE ändert man die Werte existierender Datensätze. Die Syntax lautet:


Diese Anweisung untersucht zuerst die WHERE-Klausel. In der Tabelle werden alle Datensätze, für die die WHERE-Klausel das Ergebnis TRUE liefert, mit dem korrespondierenden Wert aktualisiert.


Beispiel 8.4

Dieses Beispiel zeigt den Einsatz der Anweisung UPDATE:


SQL> UPDATE SAMMLUNG
2 SET WERT = 900
3 WHERE STUECK = 'KETTE';


1 Zeile wurde aktualisiert.


Mit der Abfrage


SQL> SELECT * FROM SAMMLUNG
2 WHERE STUECK = 'KETTE';


prüft man die Änderung und erhält als Ergebnis


STUECK WERT BEMERKUNGEN
-------------------- --------- ----------------------------------------
KETTE 900 WIRD IRGENDWANN WERTVOLL

1 Zeile wurde ausgewählt.


Das folgende Beispiel zeigt eine mehrspaltige Aktualisierung:


SQL> UPDATE SAMMLUNG
2 SET WERT = 900, STUECK = 'BALL'
3 WHERE STUECK = 'KETTE';

1 Zeile wurde aktualisiert.


Die Implementierung Ihrer Datenbank kann eine etwas abweichende Syntax für mehrspaltige Aktualisierungen verwenden.

Beachten Sie, daß der Wert 900 in der SET-Anweisung keine Apostrophe aufweist, da es sich um einen numerischen Datentyp handelt. Dagegen ist KETTE ein Zeichentyp und erfordert Apostrophe.

Beispiel 8.5

Läßt man die WHERE-Klausel weg, aktualisiert die Anweisung alle Datensätze in der Tabelle SAMMLUNG mit dem angegebenen Wert.


SQL> UPDATE SAMMLUNG
2 SET WERT = 555;


6 Zeilen wurden aktualisiert.


Die Ausführung einer SELECT-Abfrage zeigt, daß nun alle Datensätze in der Datenbank diesen Wert enthalten:


SQL> SELECT * FROM SAMMLUNG;

STUECK WERT BEMERKUNGEN
-------------------- --------- ----------------------------------------
WEGWEISER 555 FEHLT JETZT IN ADORF
MALIBU BARBIE 555 REPARIEREN
R2D2-MODELL 555 STEUERUNG DEFEKT
LOCKE VON SUSI 555 KAHLE STELLE NOCH NICHT BEMERKT
SCHUMI-CAP 555 IN SPA GEFUNDEN
BALL 555 WIRD IRGENDWANN WERTVOLL

6 Zeilen ausgewählt.


Natürlich sollte man prüfen, ob die zu aktualisierende Spalte nur eindeutige Werte zuläßt.


Läßt man die WHERE-Klausel in der UPDATE-Anweisung weg, werden alle Datensätze in der betreffenden Tabelle aktualisiert.

Einige Datenbanksysteme bieten eine Erweiterung zur Standardsyntax der UPDATE-Anweisung. Beispielsweise kann man den Inhalt einer Tabelle, basierend auf dem Inhalt mehrerer anderer Tabellen, mittels einer FROM-Klausel aktualisieren. Die erweiterte Syntax sieht folgendermaßen aus:


Beispiel 8.6

Das folgende Beispiel demonstriert diese Erweiterung:


SQL> UPDATE SAMMLUNG
2 SET WERT = WERT * 0.005;


Die Tabelle wird damit wie folgt geändert:


SQL> SELECT * FROM SAMMLUNG;

STUECK WERT BEMERKUNGEN
-------------------- --------- ----------------------------------------
WEGWEISER 2,78 FEHLT JETZT IN ADORF
MALIBU BARBIE 2,78 REPARIEREN
R2D2-MODELL 2,78 STEUERUNG DEFEKT
LOCKE VON SUSI 2,78 KAHLE STELLE NOCH NICHT BEMERKT
SCHUMI-CAP 2,78 IN SPA GEFUNDEN
BALL 2,78 WIRD IRGENDWANN WERTVOLL
6 Zeilen ausgewählt.


Diese Syntax bietet sich an, wenn man den Inhalt einer Tabelle im Anschluß an die Manipulation mehrerer anderer Tabellen aktualisieren muß. Allerdings gehört diese Syntaxform nicht zum Standard. Sie sollten in der Dokumentation des konkreten Datenbank-Managementsystems nachsehen, bevor Sie eine derartige Anweisung verwenden.

Mit der UPDATE-Anweisung lassen sich Spalten auch mit dem Ergebnis eines arithmetischen Ausdrucks aktualisieren. Der Datentyp des Ergebnisses muß dabei dem Datentyp des modifizierten Felds entsprechen. Außerdem darf die Größe des Werts nicht die Feldgröße des modifizierten Felds überschreiten.


Bei berechneten Werten können Fehler durch Rundung oder Überlauf auftreten. Rundungsfehler


Manche Datenbanksysteme behandeln einen Überlauf automatisch. Zum Beispiel konvertiert Oracle8 die Zahl in die Gleitkommadarstellung. Bei numerischen Datentypen sollte man aber immer mit derartigen Fehlern rechnen.

Aktualisiert man eine oder mehrere Spalte(n) und erhält dabei eine Fehlermeldung, führt man einen ROLLBACK-Befehl aus (wie bei fehlerhaften INSERT-Operationen), um die Aktualisierung zu annullieren. Lektion 11 geht näher auf den ROLLBACK-Befehl ein.


Die Anweisung DELETE

In einer Datenbank sind Daten nicht nur einzufügen, sondern auch zu löschen. Die Syntax des Löschbefehls DELETE lautet wie folgt:


Als erstes fällt Ihnen vielleicht auf, daß der Befehl DELETE keine Bestätigung erwartet. Viele Befehle auf Betriebssystemebene verlangen, daß der Benutzer eine Operation explizit erlaubt. Bei SQL nimmt das DBMS die Anweisung zum Löschen einer Gruppe von Datensätzen aus einer Tabelle ohne Murren entgegen. Weist man SQL also an, eine Gruppe von Datensätzen zu löschen, wird das unverzüglich wie ein militärischer Befehl ausgeführt!


In Kapitel 11 lernen Sie die Transaktionssteuerung kennen. Transaktionen sind Datenbankoperationen, bei denen der Programmierer die Änderungen an einer Datenbank explizit bestätigen (COMMIT) oder rückgängig machen (ROLLBACK) kann. Diese Operationen sind besonders in Anwendungen der Online-Transaktionsverarbeitung nützlich, wo man einen Stapel von Modifikationen an der Datenbank in einer logischen Einheit durchführen möchte. Wenn mehrere Benutzer gleichzeitig auf dieselben Daten zugreifen und diese modifizieren, treten Probleme mit der Datenintegrität auf. Momentan gehen wir davon aus, daß keine Transaktionen laufen.


Manche Implementierungen (wie zum Beispiel Oracle) lösen automatisch einen COMMIT-Befehl aus, wenn man SQL beendet.

Je nach WHERE-Klausel in der DELETE-Anweisung kann SQL folgende Aufgaben ausführen:


Beim Einsatz der DELETE-Anweisung sind mehrere Punkte zu beachten:


Beispiel 8.7

Dieses Beispiel zeigt, wie man alle Datensätze aus der Tabelle SAMMLUNG löscht, in denen WERT kleiner als 375 ist.


Ausgangspunkt für dieses Beispiel ist die Tabelle SAMMLUNG mit dem Stand von Beispiel 8.2.

SQL> DELETE FROM SAMMLUNG
2 WHERE WERT < 375;

4 Zeilen wurden gelöscht.


Das Ergebnis ist folgende Tabelle:


SQL> SELECT * FROM SAMMLUNG;

STUECK WERT BEMERKUNGEN
-------------------- --------- ----------------------------------------
R2D2-MODELL 850 STEUERUNG DEFEKT
KETTE 1000 WIRD IRGENDWANN WERTVOLL

2 Zeilen ausgewählt.


Analog zur Anweisung UPDATE werden bei DELETE alle Zeilen in der betreffenden Tabelle gelöscht, wenn man die WHERE-Klausel nicht angibt.

Beispiel 8.8 führt eine Gruppe von Datenbankoperationen mit allen drei Anweisungen zur Datenmanipulation aus.


Beispiel 8.8

Dieses Beispiel fügt neue Zeilen in die heute bereits verwendete Tabelle SAMMLUNG ein.


INSERT INTO SAMMLUNG
2 VALUES('TIGERFELL',5000,'HOCHZEITSGESCHENK');


1 Zeile wurde erstellt.


SQL> INSERT INTO SAMMLUNG
2 VALUES('TRS MODEL III',50,'ERSTER COMPUTER');

1 Zeile wurde erstellt.


Jetzt erstellen Sie eine neue Tabelle und kopieren diese Daten dorthin:


SQL> CREATE TABLE TEMP
2 (NAME CHAR(20),
3 WERT NUMBER,
4 BEMERKUNGEN CHAR(40));

Tabelle wurde angelegt.


SQL> INSERT INTO TEMP(NAME, WERT, BEMERKUNGEN)
2 SELECT STUECK, WERT, BEMERKUNGEN
3 FROM SAMMLUNG;

4 Zeilen wurden erstellt.


SQL> SELECT * FROM TEMP;

NAME WERT BEMERKUNGEN
-------------------- --------- ----------------------------------------
R2D2-MODELL 850 STEUERUNG DEFEKT
KETTE 1000 WIRD IRGENDWANN WERTVOLL
TIGERFELL 5000 HOCHZEITSGESCHENK
TRS MODEL III 50 ERSTER COMPUTER

4 Zeilen ausgewählt.


Ändern Sie nun einige Werte:


SQL> UPDATE TEMP
2 SET WERT = 100
3 WHERE NAME = 'TRS MODEL III';

1 Zeile wurde aktualisiert.


SQL> UPDATE TEMP
2 SET WERT = 8000
3 WHERE NAME = 'TIGERFELL';

1 Zeile wurde aktualisiert.


SQL> SELECT * FROM TEMP;

NAME WERT BEMERKUNGEN
-------------------- --------- ----------------------------------------
R2D2-MODELL 850 STEUERUNG DEFEKT
KETTE 1000 WIRD IRGENDWANN WERTVOLL
TIGERFELL 8000 HOCHZEITSGESCHENK
TRS MODEL III 100 ERSTER COMPUTER

4 Zeilen ausgewählt.


Übernehmen Sie diese Werte nun wieder in die Originaltabelle:


SQL> DELETE FROM SAMMLUNG;

4 Zeilen wurden gelöscht.

SQL> INSERT INTO SAMMLUNG
2 SELECT * FROM TEMP;

4 Zeilen wurden erstellt.

SQL> DROP TABLE TEMP;

Tabelle wurde gelöscht.


Auf die Anweisungen DROP TABLE und CREATE TABLE geht Tag 9 näher ein. Momentan genügt es zu wissen, daß diese Anweisungen eine Tabelle löschen (DROP) bzw. eine Tabelle erzeugen (CREATE). Beachten Sie, daß DROP TABLE eine Tabelle unwiederbringlich löscht, während DELETE FROM <Tabellenname> nur die Datensätze aus einer Tabelle entfernt.

Um die ausgeführten Aktionen nachzuprüfen, wählen Sie die Datensätze aus der Tabelle SAMMLUNG aus. Wie erwartet, sind die Änderungen in der Tabelle SAMMLUNG enthalten.


SQL> SELECT * FROM SAMMLUNG;

STUECK WERT BEMERKUNGEN
-------------------- --------- ----------------------------------------
R2D2-MODELL 850 STEUERUNG DEFEKT
KETTE 1000 WIRD IRGENDWANN WERTVOLL
TIGERFELL 8000 HOCHZEITSGESCHENK
TRS MODEL III 100 ERSTER COMPUTER

4 Zeilen ausgewählt.


Das obige Beispiel hat mit allen drei Befehlen zur Datenmanipulation - INSERT, UPDATE und DELETE - eine Gruppe von Operationen auf einer Tabelle ausgeführt. Die DELETE-Anweisung läßt sich am einfachsten verwenden.

Denken Sie immer daran, daß alle Modifikationen die referentielle Integrität Ihrer Datenbank beeinflussen können. Überlegen Sie sich zunächst alle Schritte für die Bearbeitung der Datenbank, um sicherzustellen, daß Sie alle Tabellen korrekt aktualisieren.


Daten importieren und exportieren

In einem Datenbankprogramm stellen INSERT, UPDATE und DELETE mächtige Anweisungen dar, die in Verbindung mit der SELECT-Anweisung die Grundlage für alle anderen Datenbankoperationen bilden. Allerdings lassen sich mit der Sprache SQL keine Daten aus fremden Datenquellen importieren oder dorthin exportieren. Zum Beispiel kann in Ihrer Firma seit mehreren Jahren eine dBase-Anwendung existieren, die nun aus den Nähten platzt. Ihr Chef möchte das Ganze in eine Client/Server-Anwendung auf der Basis eines RDBMS von Oracle konvertieren. Zu Ihrem Pech enthalten die dBase-Dateien Tausende von Datensätzen, die Sie in die Oracle-Datenbank konvertieren müssen. Die Befehle INSERT, UPDATE und DELETE helfen Ihnen zwar bei einer bereits gefüllten Oracle-Datenbank weiter, aber wahrscheinlich würden Sie eher kündigen, als 300000 Datensätze neu einzutippen. Glücklicherweise haben Oracle und andere Hersteller Werkzeuge vorgesehen, die Ihnen die Übertragung der Datensätze ermöglichen.


Nahezu alle Datenbanksysteme erlauben das Importieren und Exportieren von Daten über Textdateien im ASCII-Format. Da die entsprechenden Funktionen nicht zur Sprache SQL gehören, wird Ihnen SQL (oder Ihr Chef) nicht weiterhelfen, wenn Sie nur eine leere Datenbank zu bieten haben. Wir gehen kurz auf die verfügbaren Werkzeuge zum Importieren/Exportieren in folgenden Produkten ein: Microsoft Access, Microsoft und Sybase SQL Server sowie Personal Oracle8.



Microsoft Access

Microsoft Access ist ausschließlich für PC-Systeme vorgesehen. Dieses Produkt enthält viele Merkmale eines relationalen Datenbank-Managementsystems. Zum Lieferumfang von Access gehören ein leistungsfähiges Werkzeug zur Berichtserstellung, eine mit Visual Basic ähnliche Makrosprache und die Fähigkeit, Daten von und zu verschiedenen Datenbank- und Textformaten zu importieren bzw. zu exportieren. Dieser Abschnitt beschäftigt sich mit den zuletzt genannten Funktionen. Dabei ist insbesondere die Fähigkeit zum Exportieren in Textdateien mit Trennzeichen interessant. Diese Trennzeichen - spezielle Zeichen wie Komma, Anführungszeichen oder Leerzeichen - begrenzen die einzelnen Felder einer Tabelle.


Access erlaubt das Importieren und Exportieren in verschiedenartigen Datenbankformaten. Dazu gehören dBase, FoxPro und Paradox sowie SQL-Tabellen und Daten aus Programmen und Datenbanken, die das ODBC-Protokoll unterstützen. (Tag 13 geht näher auf Microsoft ODBC ein.)


Das folgende Beispiel zeigt, wie Sie die Tabelle ARTIKEL aus der Beispieldatenbank NORDWIND von Access in eine Textdatei mit Trennzeichen exportieren.


Markieren Sie im Datenbankfenster die Tabelle oder Abfrage, die Sie exportieren möchten (siehe Abbildung 8.1).


Abbildung 8.1:
Auswahl der zu exportierenden Tabelle

Wählen Sie den Befehl Datei | Speichern unter/Exportieren. Es erscheint das Dialogfeld Speichern unter. Klicken Sie auf die Option In eine externe Datei oder Datenbank. Es erscheint das in Abbildung 8.2 dargestellte Dialogfeld Speichern Tabelle 'Artikel' als. Wählen Sie im Listenfeld Dateityp den Eintrag Textdateien, legen Sie im Feld Dateiname den Namen der Zieldatei und über das Listenfeld Speichern in den Pfad fest.


Abbildung 8.2:
Einrichten von Name, Typ und Pfad für die Zieldatei

Klicken Sie auf die Schaltfläche Exportieren. Daraufhin wird der Textexport-Assistent (siehe Abbildung 8.3) geöffnet. Die Option Mit Trennzeichen


Abbildung 8.3:
Festlegen der Exportspezifikationen

Über die Schaltfläche Speichern unter können Sie die gewählten Einstellungen für eine erneute Verwendung speichern. Die Schaltfläche Spezifikation erlaubt die Auswahl bereits gespeicherter Einstellungen. Klicken Sie im Dialogfeld Exportspezifikation auf OK und in den Dialogfeldern des Textexport-Assistenten auf Weiter bzw. Fertigstellen, um die Tabelle Artikel in die Textdatei Artikel.txt mit Trennzeichen zu exportieren.



Microsoft und Sybase SQL Server

Von Microsoft und Sybase stammt ein gemeinsam entwickeltes leistungsfähiges Datenbanksystem, das in der Client/Server-Anwendungsentwicklung sehr populär ist: SQL Server. Dabei konzentriert sich Microsoft laut Übereinkunft auf Versionen für bestimmte Plattformen, während Sybase die Versionen für alle anderen Plattformen (in der Regel die größeren) entwickelt. Auch wenn in den letzten Jahren einige Verschiebungen bei dieser Aufteilung zu verzeichnen sind, weisen wir auf die gemeinsame Wurzel hin, damit Sie die heute auf dem Markt befindlichen Datenbanksysteme richtig einordnen können.


SQL Server stellt die Importieren/Exportieren-Funktionen für Dateien mit dem Werkzeug bcp bereit. Dieser Name steht für bulk copy (etwa Massenkopie). Der Grundgedanke hinter bcp ist der gleiche wie der hinter Microsoft Access. Leider muß man die Befehle bei bcp von der Eingabeaufforderung auslösen und kann nicht über Dialogfelder oder Fenster arbeiten.


bcp importiert und exportiert Textdateien fester Breite. Man kann eine Datei mit der weiter oben beschriebenen Methode von Microsoft Access exportieren und dann dieselbe Datei direkt in eine SQL-Server-Tabelle mittels bcp importieren. bcp legt die Importspezifikationen in Formatdateien (normalerweise mit der Erweiterung .FMT) ab. Diesen Spezifikationen entnimmt bcp die Spaltennamen, Feldbreiten und Feldbegrenzer. Nachdem man eine Datenbank erstellt hat, kann man bcp aus einem Skript heraus ausführen, um die Daten komplett zu importieren.



Personal Oracle8

Personal Oracle8 erlaubt das Importieren und Exportieren von Daten aus Textdateien im ASCII-Format mit Trennzeichen oder Datensätzen fester Länge. Das entsprechende Werkzeug heißt SQL*Loader. Es stützt sich auf eine Steuerdatei (mit der Erweiterung .CTL), die der Formatdatei von SQL Server ähnlich ist. SQL*Loader holt sich hier die für das Importieren der Daten erforderlichen Angaben. Die verfügbaren Parameter und deren Bedeutung entnehmen Sie bitte der Oracle-Dokumentation.



Zusammenfassung

SQL stellt drei Anweisungen für die Manipulation von Daten in einer Datenbank bereit.


Die Anweisung INSERT begegnet uns in zwei Varianten. Die Anweisung INSERT...VALUES fügt einen Satz von Werten in einen Datensatz ein. Die Anweisung INSERT...SELECT verwendet man in Verbindung mit einer SELECT-Anweisung, um mehrere Datensätze in eine Tabelle, basierend auf dem Inhalt einer oder mehrerer Tabellen, einzufügen. Die SELECT-Anweisung kann Tabellen verknüpfen, und die Ergebnisse dieser Verknüpfung lassen sich in eine andere Tabelle einfügen.


Die Anweisung UPDATE ändert die Werte einer oder mehrerer Spalten abhängig von bestimmten Bedingungen. Die aktualisierten Werte können auch das Ergebnis eines Ausdrucks oder einer Berechnung sein.


DELETE ist die einfachste der drei Anweisungen und löscht aus einer Tabelle alle Zeilen, die den Kriterien in einer optionalen WHERE-Klausel entsprechen. Wenn man die WHERE-Klausel wegläßt, werden alle Datensätze aus der Tabelle gelöscht.


Moderne Datenbanksysteme bieten verschiedene Werkzeuge für die Manipulation von Daten. Einige dieser Werkzeuge erlauben dem Entwickler, Daten aus fremden Datenquellen zu importieren oder dorthin zu exportieren. Diese Funktionen sind insbesondere dann von Nutzen, wenn eine Datenbank auf ein anderes System zuzuschneiden (zu vergrößern oder zu verkleinern) ist. Microsoft Access, Microsoft und Sybase SQL Server sowie Personal Oracle8 unterstützen den Datentransfer zwischen verschiedenen Systemen in zahlreichen Dateiformaten.



Fragen & Antworten

Frage:

Verfügt SQL über Anweisungen zum Importieren oder Exportieren von Dateien?

Antwort:

Nein. Importieren und Exportieren sind Operationen, die von der konkreten Implementierung abhängig sind. Prinzipiell erlaubt das ANSI-Komitee den Herstellern, ihre Produkte nach Belieben zu erweitern.

Frage:

Kann ich Daten innerhalb derselben Tabelle mit Hilfe des INSERT-Befehls kopieren? Ich möchte Kopien aller vorhandenen Datensätze anlegen und dabei die Werte in einem Feld ändern.

Antwort:

Nein. Daten lassen sich nicht in dieselbe Tabelle einfügen, aus der man die Daten ausgewählt hat. Allerdings kann man die Originaldaten in einer temporären Tabelle ablegen. (Echte temporäre Tabellen behandelt Tag 14.) Dann modifiziert man die Daten in dieser temporären Tabelle und selektiert sie zurück in die Originaltabelle. Achten Sie dabei auf eindeutige Felder, die Sie eventuell bereits erzeugt haben. Ein eindeutiges Feld bedeutet, daß in dieser Spalte der Tabelle keine doppelten Werte vorkommen dürfen.

Frage:

Es wurde betont, daß man die Befehle INSERT, UPDATE und DELETE mit Umsicht einsetzen sollte. Es scheint aber einfache Korrekturmöglichkeiten zu geben. Ist diese Feststellung richtig?

Antwort:

Ja. Beispielsweise ist es einfach, einen falsch geschriebenen Namen zu ändern, indem man einen ROLLBACK-Befehl ausführt und das Einfügen damit rückgängig macht. Eine weitere Korrekturmöglichkeit besteht darin, eine Aktualisierung (UPDATE) des falsch geschriebenen Namens vorzunehmen. Man kann auch die Zeile löschen und sie erneut mit dem korrekt geschriebenen Namen einfügen.

Nehmen wir aber an, daß Sie eine Million Zeilen in eine Tabelle eingefügt und mit dem Befehl COMMIT bestätigt haben. Einige Zeit später stellt jemand einen falsch geschriebenen Namen fest. Die Arbeit von zwei Wochen steckt in dieser Datenbank. Globale Änderungen kommen wahrscheinlich nicht in Frage, so daß Sie mühevoll Einzelkorrekturen ausführen müssen. In vielen Fällen wissen Sie vielleicht nicht einmal, was zu ändern ist. Dann bleibt Ihnen nur noch übrig, die Datenbank neu aufzubauen.


Workshop


Kontrollfragen

1. Wo liegt der Fehler in der folgenden Anweisung?


DELETE SAMMLUNG;


2. Was ist in der folgenden Anweisung falsch?


INSERT INTO SAMMLUNG
SELECT * FROM TABELLE_2


3. Was stimmt mit der folgenden Anweisung nicht?


UPDATE SAMMLUNG ('EINTRITTSKARTE',
25000, 'GEFUNDEN');


4. Was passiert, wenn man die folgende Anweisung ausführt?


SQL> DELETE * FROM SAMMLUNG;


5. Was passiert, wenn man die folgende Anweisung ausführt?


SQL> DELETE FROM SAMMLUNG;


6. Was passiert, wenn man die folgende Anweisung ausführt?


SQL> UPDATE SAMMLUNG
SET WERT = 555
SET BEMERKUNGEN = 'AUSGEHEND VON 525';


7. Funktioniert die folgende SQL-Anweisung?


SQL> INSERT INTO SAMMLUNG
SET WERT = 900
WHERE STUECK = 'KETTE';


8. Funktioniert die folgende SQL-Anweisung?


SQL> UPDATE SAMMLUNG
SET WERT = 900
WHERE STUECK = 'KETTE';



Übungen

1. Versuchen Sie, in eine Tabelle Werte des falschen Datentyps einzufügen. Beachten Sie die Fehler, und fügen Sie dann Werte mit den korrekten Datentypen in dieselbe Tabelle ein.


2. Probieren Sie auf Ihrem Datenbanksystem das Exportieren einer Tabelle (oder einer gesamten Datenbank) in ein anderes Format aus. Importieren Sie dann die Daten zurück in Ihre Datenbank. Machen Sie sich mit diesen Möglichkeiten vertraut. Exportieren Sie auch die Tabellen in ein anderes Datenbankformat, falls Ihr DBMS dieses Merkmal unterstützt. Arbeiten Sie dann mit dem anderen System, um diese Dateien zu öffnen und zu untersuchen.