Literale in der Auswahlliste in SQL
Vorbereitung
Zum Nachvollziehen der folgenden Beispiele kann das folgende Skript in einen MySQL -Klienten kopiert werden. Der Inhalt dieses Skripts kann aber ansonsten ignoriert werden. Beim Kopieren ist darauf zu achten, nur genau den Text von »DROP« bis zum letzten »;« zu kopieren und dann die Eingabetaste zu drücken.
- Skript (MySQL )
DROP SCHEMA S; CREATE SCHEMA S; USE S;
CREATE TABLE ONE ( COL VARCHAR ( 255 ));
INSERT INTO ONE ( COL ) VALUES ( '0' );CREATE TABLE THREE ( COL VARCHAR ( 255 ));
INSERT INTO THREE ( COL ) VALUES ( '0' );
INSERT INTO THREE ( COL ) VALUES ( '1' );
INSERT INTO THREE ( COL ) VALUES ( '2' );
Auswahllisten
Erinnerung Die gesamte Angabe zwischen »SELECT« und »FROM« in einer Abfragespezifikation wird Auswahlliste (»<selection list>«) genannt. Sie enthält durch ein Komma getrennte Ausdrücke zum Inhalt jeweils einer Spalte der Ergebnistabelle. Ein Ausdruck gibt einen bestimmten Wert an. Beispielsweise enthält die Abfragespezifikation »SELECT COL FROM ONE« die Auswahlliste »COL« mit dem Ausdruck »COL«
Vorstellung der angelegten Basistabellen
Die Tabelle »ONE«
Die folgenden Konsolenaufzeichnungen zeigen die Tabelle »ONE«. Es handelt sich um eine Tabelle mit genau einer Zeile.
- Konsole
SELECT * FROM ONE;
+------+
| COL |
+------+
| 0 |
+------+
In Skripten ist es oft besser, Tabellen mit ausdrücklichen Spaltennamen in der Auswahlliste abzufragen.
- Konsole
SELECT COL FROM ONE;
+------+
| COL |
+------+
| 0 |
+------+
Selbst bei einer Tabelle mit nur einer Spalte, kann die Auswahlliste auch mehrere Einträge enthalten.
- Konsole
SELECT COL, COL FROM ONE;
+------+------+
| COL | COL |
+------+------+
| 0 | 0 |
+------+------+
Die Tabelle »THREE«
Die folgende Konsolenaufzeichnung zeigt die Tabelle »THREE«. Es handelt sich um eine Tabelle mit genau drei Zeilen.
- Konsole
SELECT * FROM THREE;
+------+
| COL |
+------+
| 0 |
| 1 |
| 2 |
+------+
Abfragen mit Literalwerten
Auch Zeichenfolgenliterale können auch als Ausdrücke in der Auswahlliste verwendet werden. Dann erhalten alle Zeilen der abgeleiteten Tabelle in der entsprechenden Spalte den Wert des Zeichenfolgenliterals. Die entsprechende Spalte wird von MySQL auch nach der Zeichenfolge benannt, wenn nichts anderes angegeben ist.
Beispiele
Beispiel mit einer Zeile
Im folgenden sieht man das Anlegen einer Spalte »B« mit dem Wert »B« durch ein Zeichenfolgenliteral »'B'« am Anfang der Auswahlliste »'B', COL«. Da die verwendete Basistabelle »COL« genau eine Zeile hat, hat auch die abgeleitete Tabelle bei dieser Abfrage ohne Restriktion genau eine Zeile.
- Konsole
SELECT 'B', COL FROM ONE;
+---+------+
| B | COL |
+---+------+
| B | A |
+---+------+
Beispiel mit drei Zeilen
Das folgende Beispiel ähnelt dem voranstehenden, nur hat die Basistabelle diesmal genau drei Zeilen, weswegen auch die abgeleitete Tabelle genau drei Zeilen hat.
- Konsole
SELECT 'B', COL FROM THREE;
+---+------+
| B | COL |
+---+------+
| B | 0 |
| B | 1 |
| B | 2 |
+---+------+
Der Wert des Literals erscheint in jeder Zeile in der Spalte des Literals.
Beispiele ohne Spalten der Basistabelle
Es ist auch erlaubt, ausschließlich Literale zu verwenden, ohne daß noch Bezug auf eine Spalte einer Tabelle hinter »FROM« genommen wird.
Beispiel mit einer Zeile
Im folgende Beispiel erhalten wir so eine Tabelle, die nur die Spalte zu dem Literal »'B'« enthält und die Anzahl der Zeilen weiterhin von der Basistabelle »ONE« übernimmt.
- Konsole
SELECT 'B' FROM ONE;
+---+
| B |
+---+
| B |
+---+
Beispiel mit drei Zeilen
Die folgende Tabelle übernimmt die Anzahl der Zeilen von der Basistabelle »THREE«, so daß sie nun genau drei Zeilen umfaßt.
- Konsole
SELECT 'B' FROM THREE;
+---+
| B |
+---+
| B |
| B |
| B |
+---+
Beispiel mit zwei Spalten
In der folgenden Abfrage findet sich eine Auswahlliste mit zwei Zeichenfolgenliteralen »'B'« und »'C'«. Die verwendete Basistabelle hat eine Zeile. Entsprechend ergibt sich eine abgeleitete Tabelle mit zwei Spalten und einer Zeile.
- Konsole
SELECT 'B', 'C' FROM ONE;
+---+---+
| B | C |
+---+---+
| B | C |
+---+---+
Beispiel mit drei Zeilen
Die folgende Tabelle übernimmt die Anzahl der Zeilen von der Basistabelle »THREE«, so daß sie nun genau drei Zeilen umfaßt.
- Konsole
SELECT 'B', 'C' FROM THREE;
+---+---+
| B | C |
+---+---+
| B | C |
| B | C |
| B | C |
+---+---+
Beispiel mit »DISTINCT«
Das folgende Beispiel zeigt eine Verwendung von »DISTINCT«, welche die Anzahl von Zeilen wieder auf Eins reduziert.
- Konsole
SELECT DISTINCT 'B', 'C' FROM THREE;
+---+---+
| B | C |
+---+---+
| B | C |
+---+---+
Beispiel mit benannten Spalten
Das folgende Beispiel zeigt wie die Namen von Spalten frei festgelegt werden können.
Auf diese Weise ist es möglich, eine einzeilige Tabelle mit einer Zeile fast ganz in der Abfrage festzulegen.
- Konsole
SELECT 'B' AS X, 'C' AS Y FROM ONE;
+---+---+
| X | Y |
+---+---+
| B | C |
+---+---+
Beispiel mit drei Zeilen
Falls die Basistabelle »THREE« verwendet wird, so ergeben sich wieder drei Zeilen, die aber den gleichen Inhalt haben.
- Konsole
SELECT 'B' AS X, 'C' AS Y FROM THREE;
+---+---+
| X | Y |
+---+---+
| B | C |
| B | C |
| B | C |
+---+---+
Mehrzeilige synthetische Tabellen
Es ist auch möglich Tabellen mit mehreren Zeilen anzulegen, deren Inhalte praktisch in der Abfrage festgelegt werden.
- Konsole
SELECT 'B' AS X, 'C' AS Y FROM ONE
UNION
SELECT 'D' AS X, 'E' AS Y FROM ONE;+---+---+
| X | Y |
+---+---+
| B | C |
| D | E |
+---+---+
Berechnete Spalten und Wertausdrücke
Eine Spalte wie die Spalte aus der Abfrage »SELECT 'Alpha' FROM ONE;«, deren Werte nicht direkt aus einer Spalte einer Tabelle übernommen wurden, wird in der Literatur auch als „berechnete Spalte “ oder „Ausdrucksspalte “ bezeichnet.
Alle (teilweise durch Komma getrennten) Angaben in der Auswahlliste nach »SELECT« sind laut 9075-2 7.12 (Entwurf von 2010) Wertausdrücke (〈value expression 〉s), egal ob darin ein Spaltenname vorkommt oder nicht. Daher ist die Unterscheidung zwischen Ausdrucksspalten und Spaltennamen nur eine vorübergehende Lernhilfe (Spaltennamen sind auch Ausdrücke), die aber in SQL oft nicht wichtig ist.
Der Spaltenname ist implementationsabhänig (DIS 9075-2:2014(E), 7.16 <query specification>, “13 o)iii”), er wird als durch das verwendete Datenbankprogramm festgelegt, falls er nicht in der Abfrage mit einer AS-Klausel festgelegt wurde.
Notwendigkeit der Angabe einer Basistabelle
Falls keine Werte aus der Basistabelle mehr übernommen werden, gibt es eigentlich keinen inhaltlichen Grund für die Angabe einer Basistabelle mehr, doch diese wird von SQL verlangt!
Syntax
Das folgende vereinfachte Syntaxdiagram verzichtet zur Vereinfachung auf die Wiedergabe der Möglichkeit, mit »AS« Spaltennamen festzulegen.
- Syntaxdiagramm (vereinfacht)
Abfragespezifikation
.------------------------------.
.------. | .---------------------. v .--------------. .------------------.
--->( SELECT )---'--->| Mengenspezifizierer |---'--->| Auswahlliste |--->| Tabellenausdruck |--->
'------' '---------------------' '--------------' '------------------'Mengenspezifizierer
.--------.
--->( DISTINCT )--->
'--------'Auswahlliste
.--------------.
---.---.--->| Wertausdruck |---.---.--->
| ^ '--------------' | |
| | value expression | |
| | | |
| | .-. | |
| '---------( , )---------' |
| '-' |
| .-. |
'------------>( * )-------------'
'-'Wertausdruck
.---------------------------.
---.--->| Zeichenfolgenwertausdruck |---.--->
| '---------------------------' |
| string value expression |
| |
| .---------------------------. |
'--->| Spaltenreferenz |---'
'---------------------------'
column referenceZeichenfolgenwertausdruck
.-. .-.
--->( ' )---.---------------------------.--->( ' )--->
'-' ^ | '-'
| .-------------------. |
'---| einfaches Zeichen |---'
'-------------------'
kein ApostrophSpaltenreferenz
.------------.
---.--->| Bezeichner |---.--->
^ '------------' |
| identifier |
| |
| .-. |
'--------( . )--------'
'-'
Semantik
Die Auswahlliste bestimmt die Spalten der Ergebnistabelle.
Falls die Auswahlliste aus einem Stern besteht, werden alle Spalten des Tabellenausdrucks übernommen.
Sonst besteht die Auswahlliste aus einer Folge kommagetrennter Wertausdrücke, und jeder Wertausdruck legt dann den Inhalt einer Spalte der abgeleiteten Tabelle fest.
Falls der Wertausdruck ein Zeichenfolgenausdruck ist, so enthält die entsprechende Spalte die durch den Zeichenfolgenausdruck angegebene Zeichenfolge.
Sonst ist der Wertausdruck eine Spaltenreferenz (ein Spaltenname) und die entsprechende Spalte enthält die Werte des Tabellenausdrucks in der Spalte mit dem angegebenen Namen.
MySQL-Erweiterungen
Sterne in der Auswahlliste
MySQL erlaubt zusätzlich zu Standard-SQL auch noch Sterne in der Auswahlliste, wie in »SELECT *, 1 FROM ONE«.
- Konsole
SELECT *, '1' FROM ONE;
+------+---+
| COL | 1 |
+------+---+
| 0 | 1 |
+------+---+
Hierbei werden an Stelle des Sternches alle Spalten des Tabellenausdrucks eingefügt.
NULL-Literale in der Auswahlliste
MySQL erlaubt zusätzlich zu Standard-SQL auch noch »NULL« in der Auswahlliste, wie in »SELECT NULL FROM ONE«.
- Konsole
SELECT NULL FROM ONE;
+------+
| NULL |
+------+
| NULL |
+------+
Hierbei wird an Stelle der »NULL« eine Spalte mit dem Wert »NULL« eingefügt.
Übungsaufgaben
/ Tabellen anlegen und abfragen
- Skript (MySQL )
DROP SCHEMA D; CREATE SCHEMA D; USE D;
CREATE TABLE FRAU
( VORNAME VARCHAR ( 255 ),
NACHNAME VARCHAR ( 255 ));INSERT INTO FRAU ( VORNAME, NACHNAME ) VALUES ( 'Anita', 'Holm' );
INSERT INTO FRAU ( VORNAME, NACHNAME ) VALUES ( 'Cathrin', 'Naumann' );
INSERT INTO FRAU ( VORNAME, NACHNAME ) VALUES ( 'Simone', 'Meijer' );
INSERT INTO FRAU ( VORNAME, NACHNAME ) VALUES ( 'Monika', 'Zöllner-Monsé' );
INSERT INTO FRAU ( VORNAME, NACHNAME ) VALUES ( 'Birgit', 'Leusmann' );
INSERT INTO FRAU ( VORNAME, NACHNAME ) VALUES ( 'Ramona', 'Lensing' );CREATE TABLE MANN
( VORNAME VARCHAR ( 255 ),
NACHNAME VARCHAR ( 255 ));INSERT INTO MANN ( VORNAME, NACHNAME ) VALUES ( 'Nicolas', 'Zeeck' );
INSERT INTO MANN ( VORNAME, NACHNAME ) VALUES ( 'Christian', 'Moorwessel' );
INSERT INTO MANN ( VORNAME, NACHNAME ) VALUES ( 'Michael', 'Aldekamp' );
INSERT INTO MANN ( VORNAME, NACHNAME ) VALUES ( 'Andre', 'Bloemendal' );
INSERT INTO MANN ( VORNAME, NACHNAME ) VALUES ( 'Frank', 'Klokkers' );
INSERT INTO MANN ( VORNAME, NACHNAME ) VALUES ( 'Klaus-Dieter', 'Worzischek' );SELECT * FROM FRAU;
SELECT * FROM MANN;
Erstellen Sie eine Ansicht »PERSON«, welche die Tabelle »MANN« und die Tabelle »FRAU«, als drei Spalten umfassen soll: Die beiden Spalten »NACHNAME« und »VORNAME« sollen aus den Basistabellen übernommen werden. Eine weitere, zusätzliche Spalte, soll das Geschlecht der Person angeben. Die Reihenfolge der Zeilen ist auch hier wieder egal.
- Erwünschte abgeleitete Tabelle
SELECT * FROM PERSON;
+---------------+--------------+------------+
| NACHNAME | VORNAME | GESCHLECHT |
+---------------+--------------+------------+
| Holm | Anita | w |
| Naumann | Cathrin | w |
| Meijer | Simone | w |
| Zöllner-Monsé | Monika | w |
| Leusmann | Birgit | w |
| Lensing | Ramona | w |
| Zeeck | Nicolas | m |
| Moorwessel | Christian | m |
| Aldekamp | Michael | m |
| Bloemendal | Andre | m |
| Klokkers | Frank | m |
| Worzischek | Klaus-Dieter | m |
+---------------+--------------+------------+
Zusatzaufgabe Falls Sie danach noch Zeit haben, können Sie die Ansicht zu einer Basistabelle »PERSONEN« persistieren und anschließend die beiden ursprünglichen Tabellen »MANN« und »FRAU« löschen.