Abfragen ohne Basistabellen in MySQL (Abfragen ohne Basistabellen in MySQL), Lektion, Seite 723270
https://www.purl.org/stefan_ram/pub/ohne_basistabellen_sql (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram

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 reference

Zeichenfolgenwertausdruck

.-. .-.
--->( ' )---.---------------------------.--->( ' )--->
'-' ^ | '-'
| .-------------------. |
'---| 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';«

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 stefanram723270 stefan_ram:723270 Abfragen ohne Basistabellen in MySQL Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd723270, slrprddef723270, 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/ohne_basistabellen_sql