Literale in der Auswahlliste in SQL (Literale in der Auswahlliste in SQL), Lektion, Seite 723301
https://www.purl.org/stefan_ram/pub/literale_sql (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
SQL-Kurs

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 reference

Zeichenfolgenwertausdruck

.-. .-.
--->( ' )---.---------------------------.--->( ' )--->
'-' ^ | '-'
| .-------------------. |
'---| einfaches Zeichen |---'
'-------------------'
kein Apostroph

Spaltenreferenz

.------------.
---.--->| 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.

 

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram723301 stefan_ram:723301 Literale in der Auswahlliste in SQL Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd723301, slrprddef723301, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/literale_sql