Genau genommen ist die FROM
Klausel einer SELECT
Aussage nicht optional. Die Syntax für SQL-99 beschreibt die grundlegenden SELECT
Anweisungen, und die FROM
Klausel enthält keine eckigen Klammern. Dies zeigt an, dass der Standard dies als nicht optional ansieht:
SELECT [ DISTINCT | ALL ]
{Column expression [ AS name ]} [ ,... ] | *
FROM <Table reference> [ {,<Table reference>} ... ]
[ WHERE search condition ]
[ GROUP BY Columns [ HAVING condition ] ]
[ORDER BY {col_name | expr | position} [ASC | DESC],...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[PROCEDURE procedure_name(argument_list)]
[INTO OUTFILE 'file_name' export_options |
INTO DUMPFILE 'file_name' |
INTO var_name [, var_name]]
[FOR UPDATE | LOCK IN SHARE MODE]
In der Praxis ist es für Programmierer und Datenbankadministratoren häufig nützlich, andere Aktionen als die Bearbeitung von Daten in Tabellen oder die Bearbeitung von Tabellen und Datenstrukturen durchzuführen. Diese Art von Dingen geht weit über den Geltungsbereich des SQL-Standards hinaus, der sich mehr mit den Datenmerkmalen befasst als mit den Schrauben und Muttern bestimmter Implementierungen. Egal, ob wir ausführen möchten SELECT getdate()
oder SELECT 1
oder SELECT DB_NAME()
(oder was auch immer Ihr Dialekt bevorzugt), wir möchten eigentlich keine Daten aus einer Tabelle.
Oracle entscheidet sich dafür, die Standard- und Implementierungsdiskrepanz mithilfe einer Dummy-Tabelle mit der folgenden effektiven Definition zu beheben:
CREATE TABLE DUAL (
DUMMY CHAR(1)
)
INSERT INTO DUAL (DUMMY) VALUES ('X')
Andere RDBMS setzen im Wesentlichen voraus, dass eine Dummy-Tabelle verwendet wird, wenn no FROM
angegeben ist.
Die Geschichte der DUAL-Tabelle ist auf Wikipedia:
Die DUAL-Tabelle wurde von Charles Weiss vom Oracle-Konzern erstellt, um eine Tabelle für das Zusammenführen interner Ansichten bereitzustellen:
Ich habe die DUAL-Tabelle als zugrunde liegendes Objekt im Oracle Data Dictionary erstellt. Es sollte nie selbst gesehen werden, sondern in einer Ansicht verwendet werden, die abgefragt werden sollte. Die Idee war, dass Sie einen JOIN für die DUAL-Tabelle ausführen und im Ergebnis für jede Zeile in Ihrer Tabelle zwei Zeilen erstellen können. Mithilfe von GROUP BY kann der resultierende Join dann zusammengefasst werden, um die Speichermenge für den DATA-Bereich und den INDEX-Bereich (die INDEX-Bereiche) anzuzeigen. Der Name DUAL schien dafür geeignet zu sein, aus nur einer Zeile ein Zeilenpaar zu erstellen.
Die ursprüngliche DUAL-Tabelle enthielt zwei Zeilen (daher der Name), später jedoch nur eine Zeile.
select
ohne a nicht auskommenfrom
. DB2 verfügt über eine ähnliche Dummy-Tabelle mit dem Namen SYSIBM.SYSDUMMY1 . Das wissen Sie wahrscheinlich auch schon, aber wenn Sie aufselect 'A' from dual
diedual
Tabelle nicht wirklich zugreifen, wird die Frage in Ihrer Bearbeitung beantwortet (die übrigens eine neue Frage verdient hat).