Tabellenspeicher mit mehreren Zeilen in MySQL
Vorbereitung
Als Vorbereitung auf Eingaben zum Einfügen von Daten legen wir hier zunächst ein Schema und einen Tabellenspeicher an.
- Skript (MySQL )
DROP SCHEMA S; CREATE SCHEMA S; USE S;
CREATE TABLE LISTE ( I VARCHAR ( 255 ));
SELECT * FROM LISTE;
Mehrere Zeilen einfügen
Werden mehrere INSERT-Anweisungen in Folge eingegeben, so werden alle angegebenen Werte in den Tabellenspeicher eingefügt.
- Konsole (MySQL, E92, C99, C03)
INSERT INTO LISTE ( I ) VALUES ( '0' );
Query OK, 1 row affected (0.05 sec)
INSERT INTO LISTE ( I ) VALUES ( '1' );
Query OK, 1 row affected (0.02 sec)
Hinweis zur Eingabe von Zeilen: Wenn ein Zeile eingegeben werden soll, die einer zuvor eingegebenen Zeile sehr ähnlich ist, dann ist es oft nicht nötig, jedes Zeichen erneut einzutippen. Vielmehr kann die vorigen Zeile mit einem Bedienvorgang wie dem Betätigen der Pfeil-nach-oben-Taste ↑ abgerufen werden und dann überarbeitet und erneut abgeschickt werden.
- Konsole (MySQL, E92, C99, C03)
SELECT * FROM LISTE;
+------+
| I |
+------+
| 0 |
| 1 |
+------+2 rows in set (0.00 sec)
Die Ausgabe des Tabellenspeichers enthält die Angabe »2 rows in set«, welche besagt, daß der Tabellenspeicher (»set«) zwei Zeilen (»rows«) enthält. Da diese Information auch der darüberstehenden Darstellung des Tabellenspeichers entnommen werden kann und uns auch nicht immer interessiert, werden wir solche Zeilen zukünftig nicht immer mit abdrucken.
Durch SQL wird keine bestimmte Reihenfolge der Ausgabe der Zeilen nach »SELECT * FROM« garantiert.
Tabellen und Tabellenspeicher ⃗
Als Vorbereitung auf Eingaben zum Einfügen von Daten legen wir hier zunächst wieder ein leeres Schema und einen Tabellenspeicher an.
- Skript (MySQL )
DROP SCHEMA S; CREATE SCHEMA S; USE S; CREATE TABLE LISTE ( I VARCHAR ( 255 ));
- Konsole (MySQL, E92, C99, C03)
INSERT INTO LISTE ( I ) VALUES ( '0' );
Query OK, 1 row affected (0.05 sec)
- Konsole (MySQL, E92, C99, C03)
SELECT * FROM LISTE;
+------+
| I |
+------+
| 0 |
+------+1 row in set (0.00 sec)
- Konsole (MySQL, E92, C99, C03)
INSERT INTO LISTE ( I ) VALUES ( '1' );
Query OK, 1 row affected (0.02 sec)
- Konsole (MySQL, E92, C99, C03)
SELECT * FROM LISTE;
+------+
| I |
+------+
| 0 |
| 1 |
+------+2 rows in set (0.00 sec)
Wir sehen, daß der Inhalt des Tabellenspeichers »LISTE« zunächst eine Zeile umfaßt und später zwei Zeilen. Der Name »LISTE« bezeichnet also keine feste, bestimmte Tabelle, sondern einen Speicher für eine Tabelle. Daher nennen wir das von dem Namen »LISTE« Bezeichnete einen Tabellenspeicher oder eine Tabellenvariable. Dieser enthält zu einem bestimmten Zeitpunkt eine bestimmte Tabelle, kann aber zu einem anderen Zeitpunkt auch eine andere Tabelle enthalten.
In vielen Texten wird aber nicht zwischen Tabellen und Tabellenspeichern unterschieden, und beide werden „Tabellen“ genannt.
Übungsfragen
? Ausgabe vorhersagen
Die Eingabe der folgenden Zeilen führt zur daruntenstehenden Ausgabe, in der aber Teile hier durch Fragezeichen verdeckt wurden.
Nun sollen ohne tatsächliche Eingabe der Zeilen die folgenden Fragen beantwortet werden:
- Was erscheint an Stelle des ersten Fragezeichens?
- Was erscheint an Stelle der weiteren Fragezeichens?
DROP SCHEMA S; CREATE SCHEMA S; USE S;
CREATE TABLE A ( N VARCHAR ( 255 ));
INSERT INTO A ( N ) VALUES ( 'C' );
INSERT INTO A ( N ) VALUES ( 'E' );
INSERT INTO A ( N ) VALUES ( 'D' );
SELECT * FROM A;+------+
| ? |
+------+
| ? |
| ? |
| ? |
+------+
(Die Reihenfolge der Zeilen einer Tabelle hat in einer relationalen Tabelle keine Bedeutung. Daher gilt es auch als richtige Lösung, wenn die Reihenfolge der Zeilen in der Antwort anders ist als bei einer tatsächlichen Ausgabe eines Datenbanksystem nach der obenstehenden Eingabe.)
Übungsaufgaben
/ Tabellenspeicher anlegen und sichten
Geben Sie Kommandos ein, die zu der folgenden Ausgabe führen.
+-------+
| WERTE |
+-------+
| 3 |
| 7 |
| 12 |
+-------+
(Die Reihenfolge der Zeilen einer Tabelle hat in einer relationalen Tabelle keine Bedeutung. Daher gilt es auch als richtige Lösung, wenn die Reihenfolge der Zeilen in der erzeugten Ausgabe anders ist, als hier gezeigt.)
Zitate aus der Norm *
9075-2 7.3 (Entwurf von 2010, vereinfacht)*
- <table value constructor> ::= VALUES <row value expression list>
- <row value expression list> ::= <table row value expression> [ { <comma> <table row value expression> }... ]
9075-2 7.2 (Entwurf von 2010, vereinfacht)*
- <table row value expression> ::= <row value constructor>
9075-2 7.1 (Entwurf von 2010, vereinfacht)*
- <row value constructor> ::= <explicit row value constructor>
- <explicit row value constructor> ::= <left paren> <row value constructor element> <comma> <row value constructor element list> <right paren>
- <row value constructor element> ::= <value expression>
- <row value constructor element list> ::= <row value constructor element> [ { <comma> <row value constructor element> }... ]
9075-2 7.1 (Entwurf von 2010, vereinfacht)*
- Without Feature F641, “Row and table constructors”, conforming SQL language shall not contain an <explicit row value constructor> that is not simply contained in a <table value constructor> and that contains more than one <row value constructor element>.
Einfügen mehrerer Zeilen mit einer einzigen Anweisung *
Viele Datenbanksysteme unterstützen auch das Einfügen mehrerer Zeilen mit einer einzigen INSERT-Anweisung, welche hinter dem Schlüsselwort »VALUES« eine kommagetrennte Liste eingeklammerter Werte enthält.
- Konsole (MySQL, S92, 99-F641, 03-F641)
INSERT INTO LISTE ( I ) VALUES ( '100' ), ( '101' );
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0- Aussprachehinweis
- duplicate (n) ˈduːplɪkət
- Konsole (MySQL, E92, C99, C03)
SELECT * FROM LISTE;
+------+
| I |
+------+
| 0 |
| 1 |
| 100 |
| 101 |
+------+4 rows in set (0.00 sec)
- Einfuegeanweisung (vereinfacht)
.------. .-----. .------------. .-. .------------. .-. .------. .-. .--------. .-.
--->( INSERT )--->( INTO )--->| Bezeichner |---.--->( ( )--->| Bezeichner |--->( ) )---.--->( VALUES )---.--->( ( )--->| Skalar |--->( ) )---.--->
'------' '-----' '------------' | '-' '------------' '-' ^ '------' ^ '-' '--------' '-' |
| | | .-. |
'---------------------------------------' '----------------( , )--------------'
'-'
Man beachte hierbei:
- Jede Zeile wird eingeklammert.
- Die Angaben zu verschiedenen Zeilen werden mit Kommas getrennt.