Ściśle, tak, FROMklauzula SELECToświadczenia nie jest opcjonalna. Składnia SQL-99 wyszczególnia podstawowe SELECTzestawienie, a FROMklauzula 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 1lub 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 FROMokreś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.
selectbezfrom. DB2 ma podobną tabelę fikcyjną o nazwie SYSIBM.SYSDUMMY1 . Prawdopodobnie już to wiesz, ale kiedy tak naprawdę nie masz dostępuselect 'A' from dualdodualtabeli , co odpowiada na pytanie w twojej edycji (która zasługuje na nowe pytanie btw).