Abfragen ohne Basistabellen in SQL (MySQL )
Vorbereitung
Zum Nachvollziehen der folgenden Beispiele kann das folgende Skript in einen MySQL -Klienten kopiert werden.
- Skript (MySQL )
DROP SCHEMA S; CREATE SCHEMA S; USE S;
CREATE TABLE ONE ( COL VARCHAR ( 255 ));
INSERT INTO ONE ( COL ) VALUES ( 'A' );SELECT * FROM ONE;
Abfragen ohne Basistabelle in MySQL
In MySQL darf die FROM-Klausel auch weggelassen werden. Die Abfrage verhält sich dann so wie bei Abschluß der Abfrage mit von »FROM ONE« mit der oben definierten Tabelle »ONE«, wobei aber kein Spaltenname in der Auswahlliste verwendet werden darf.
- Konsole (MySQL)
SELECT 'B';
+---+
| B |
+---+
| B |
+---+SELECT 'B', 'C';
+---+---+
| B | C |
+---+---+
| B | C |
+---+---+SELECT 'B' AS Y, 'C' AS X;
+---+---+
| Y | X |
+---+---+
| B | C |
+---+---+
Dieses Weglassen der FROM-Klausel ist in Standard-SQL nicht erlaubt, wird im weiteren Verlaufe dieses Kurses hier aber von nun an zur Vereinfachung immer wieder verwendet werden.
Der Leser muß gegebenenfalls daran denken bei solchen Abfragen, die nicht von einer bestimmten Basistabelle abhängen, noch » FROM ONE« einzufügen und eine Tabelle »ONE«, wie oben gezeigt, anzulegen, falls er ein Datenbanksystem verwendet, das dies verlangt, oder Standard-SQL verwenden möchte.
Wir nennen Tabellen, die eine Abfrage ohne Verwendung von Basistabellen erzeugt auch synthetische Tabellen und sagen, daß die Abfrage sie synthetisiert.
Solche eine Abfragespezifikation (»SELECT«) ohne Tabellenausdruck (»FROM«) kann bereits verwendet werden, ohne daß vorher ein Schema mit »USE« eingestellt wurde.
Synthese skalarer Tabellen
Das Ergebnis einer Abfrage muß immer eine Tabelle sein. Deswegen liefert die folgende SELECT-Abfrage auch eine Tabelle, obwohl das Ergebnis der Abfrage eigentlich nur der Buchstabe »B« (ein Skalar) ist. Das Ergebnis der Abfrage ist eine Tabelle mit einer Zeile und einer Spalte. Solch eine Tabelle repräsentiert praktisch nur den einzigen in ihre enthaltenen Wert in der Form einer Tabelle. Da ein einzelner Wert Skalar genannt wird und die Tabelle praktisch diesen Skalar als Tabelle darstellt, nennt man solche eine Tabelle auch (wie schon am Anfang des Grundkurses einmal erwähnt) eine skalare Tabelle.
- Konsole (MySQL)
SELECT 'B';
+---+
| B |
+---+
| B |
+---+
Synthese mehrerer Zeilen
Mit einer UNION-Abfrage kann auch eine mehrzeilige Tabelle synthetisiert werden.
- Konsole (MySQL)
SELECT 'A' UNION SELECT 'B';
+---+
| A |
+---+
| A |
| B |
+---+
Festhalten von Abfragen in Ansichten
Abfragen können weiterhin in einer Ansicht festgehalten werden, auch wenn sie keinen Tabellenausdruck enthalten. Die Ansicht wird damit zu einer „synthetischen Ansicht“ (oder „synthetisierten Ansicht“). Solch eine Ansicht beruht auf keiner Basistabelle, was man ihrer Ausgabe aber nicht unbedingt ansieht. Sie hat eine gewisse Ähnlichkeit mit einer Basistabelle, da sie nun selber Daten speichert.
- Konsole (MySQL)
CREATE VIEW A AS
SELECT 'A' UNION SELECT 'B';SELECT * FROM A;
+---+
| A |
+---+
| A |
| B |
+---+
Zur Datenspeicherung sollten bevorzugt Basistabellen verwendet werden, da SQL für diese auch mehr Möglichkeiten zur Manipulation der enthaltenen Daten bereithält.
Persistieren synthetischer Tabellen
Wir hatten schon früher gelernt, daß wir abgeleitete Tabellen auch wieder persistieren können, wodurch es möglich wird, aus einer synthetischen Tabelle eine Basistabelle zu machen.
- Konsole (MySQL)
CREATE TABLE T AS SELECT 'B' AS Y, 'C' AS X;
SELECT * FROM T;
+---+---+
| Y | X |
+---+---+
| B | C |
+---+---+
Oben kann das Wort »AS« auch entfallen.
Einfügen synthetischer Tabellen ⃗
Es ist auch möglich eine synthetische Tabelle mit »INSERT« in eine vorhandene Basistabelle einzufügen.
- Konsole (MySQL)
CREATE TABLE PERSON ( VORNAME VARCHAR ( 255 ), NACHNAME VARCHAR ( 255 ));
INSERT INTO PERSON ( VORNAME, NACHNAME ) VALUES ( 'Albin', 'Veltmaat' );
INSERT INTO PERSON ( VORNAME, NACHNAME ) VALUES ( 'Ruth', 'de Jong' );
INSERT INTO PERSON
SELECT 'Dagmar', 'Buchsbaum' UNION
SELECT 'Friedegunde', 'Hanraets' UNION
SELECT 'Helmut', 'Volker';SELECT * FROM PERSON;
+-------------+-----------+
| VORNAME | NACHNAME |
+-------------+-----------+
| Albin | Veltmaat |
| Ruth | de Jong |
| Dagmar | Buchsbaum |
| Friedegunde | Hanraets |
| Helmut | Volker |
+-------------+-----------+
Diese Vorgehensweise kann aber fehlerträchtig sein, weil beim Einfügen kein Gebrauch von Spaltennamen gemacht wird, so daß es entscheidend wird, die richtige Reihenfolge der Spalten zu kennen. Auch gilt weiterhin, daß eine Abfragespezifikation (»SELECT«) ohne Tabellenausdruck (»FROM«) nicht in Standard-SQL gestattet ist.
Abfragespezifikationen als Ausdruckrahmen ⃗
Der Rahmen »SELECT …;« kann als Ausdruckrahmen genutzt werden.
- Konsole (MySQL)
SELECT 'B';
+---+
| B |
+---+
| B |
+---+
Ein Ausdruckrahmen ist ein Text mit einer Lücke. Wird ein Ausdruck in die Lücke eingesetzt, so ergibt sich eine eine Anweisung, die den Wert des eingesetzten Ausdrucks ausgegibt.
Ein Ausdruckrahmen dient also dazu, sich den Wert eines Ausdrucks anzeigen zu lassen.
Ein Ausdruck ist ein Zeichenfolgenliteral oder ein Spaltenname.
- Wertausdrücke
Wertausdruck
.---------------------------.
---.--->| Zeichenfolgenwertausdruck |---.--->
| '---------------------------' |
| string value expression |
| |
| .---------------------------. |
'--->| Spaltenreferenz |---'
'---------------------------'
column referenceZeichenfolgenwertausdruck
.-. .-.
--->( ' )---.---------------------------.--->( ' )--->
'-' ^ | '-'
| .-------------------. |
'---| einfaches Zeichen |---'
'-------------------'
kein Apostroph erlaubt
»DESCRIBE« ⃗
Die Ausgabe von »DESCRIBE« zeigt an, welche Basistabellen von einer Abfrage verwendet wurden.
- Konsole (MySQL)
DESCRIBE SELECT 'B' FROM ONE;
+-------+------+------+----------+----------------+
| table | type | rows | filtered | Extra |
+-------+------+------+----------+----------------+
| ONE | ALL | 1 | 100.00 | NULL |
+-------+------+------+----------+----------------+DESCRIBE SELECT 'B';
+-------+------+------+----------+----------------+
| table | type | rows | filtered | Extra |
+-------+------+------+----------+----------------+
| NULL | NULL | NULL | NULL | No tables used |
+-------+------+------+----------+----------------+
Übungsfragen
? Standardkonforme Abfragen
Welche der beiden folgenden Abfragen entsprechen dem SQL-Standard?
- Anton: »SELECT 'B' FROM ONE;«
- Berta: »SELECT 'B';«
? MySQL-konforme Abfragen
Welche der beiden folgenden Abfragen können mit MySQL verwendet werden?
- Anton: »SELECT 'B' FROM ONE;«
- Berta: »SELECT 'B';«
? Abfragen bei anderen Datenbanksystemen
Wie muß die folgende Abfrage verändert werden, damit sie mit möglichst vielen SQL-basierten Datenbanksystem verwendet werden kann?
- »SELECT 'B';«