Ściśle, tak, FROM
klauzula SELECT
oświadczenia nie jest opcjonalna. Składnia SQL-99 wyszczególnia podstawowe SELECT
zestawienie, a FROM
klauzula nie zawiera nawiasów kwadratowych. Oznacza to, że standard uznaje go za nieobowiązkowy:
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]
W rzeczywistości, programiści i DBA często uważają, że przydatne jest wykonywanie innych czynności niż manipulowanie danymi w tabelach lub manipulowanie tabelami i strukturami danych. Tego rodzaju rzeczy w dużej mierze wykraczają poza zakres standardu SQL, który dotyczy danych więcej niż zwykłych implementacji. Czy chcemy uruchomić SELECT getdate()
lub SELECT 1
lub SELECT DB_NAME()
(lub niezależnie od woli dialekt), to w rzeczywistości nie chcą dane z tabeli.
Oracle wybiera rozwiązanie rozbieżności między standardem a implementacją za pomocą tabeli zastępczej o następującej skutecznej definicji:
CREATE TABLE DUAL (
DUMMY CHAR(1)
)
INSERT INTO DUAL (DUMMY) VALUES ('X')
Inne RDBMS zasadniczo zakładają, że używana jest tabela zastępcza, jeśli nie FROM
określono nie.
Historia DUAL tabeli jest na Wikipedii:
Tabela DUAL została stworzona przez Charlesa Weissa z korporacji Oracle, aby zapewnić tabelę do łączenia w widokach wewnętrznych:
Stworzyłem tabelę DUAL jako podstawowy obiekt w Oracle Data Dictionary. Nigdy nie miał być widziany sam, ale zamiast tego użyty w widoku, który miał być zapytany. Pomysł polegał na tym, że można wykonać DOŁĄCZ do tabeli DUAL i utworzyć w wyniku dwa wiersze dla każdego wiersza w tabeli. Następnie, używając GROUP BY, powstałe sprzężenie może być podsumowane, aby pokazać ilość miejsca dla zakresu DATA i zakresu INDEX. Nazwa DUAL wydawała się trafna w procesie tworzenia pary rzędów z jednego.
Oryginalna tabela DUAL zawierała dwa wiersze (stąd nazwa), ale później miała tylko jeden wiersz.
select
bezfrom
. DB2 ma podobną tabelę fikcyjną o nazwie SYSIBM.SYSDUMMY1 . Prawdopodobnie już to wiesz, ale kiedy tak naprawdę nie masz dostępuselect 'A' from dual
dodual
tabeli , co odpowiada na pytanie w twojej edycji (która zasługuje na nowe pytanie btw).