In senso stretto, sì, la FROM
clausola di SELECT
un'istruzione non è facoltativa. La sintassi per SQL-99 descrive in dettaglio lo SELECT
statment di base e la FROM
clausola non ha parentesi quadre attorno. Ciò indica che lo standard lo considera non opzionale:
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]
Nell'uso effettivo, i programmatori e i DBA trovano spesso utile fare cose diverse dalla manipolazione dei dati nelle tabelle o dalle tabelle e dalle strutture dei dati. Questo tipo di cose va ampiamente al di là dell'ambito dello standard SQL, che si occupa delle caratteristiche dei dati più che degli elementi di base di implementazioni specifiche. Sia che vogliamo eseguire SELECT getdate()
o SELECT 1
o SELECT DB_NAME()
(o qualunque cosa il tuo dialetto preferisca), in realtà non vogliamo dati da una tabella.
Oracle sceglie di risolvere la discrepanza standard e di implementazione utilizzando una tabella fittizia con la seguente definizione efficace:
CREATE TABLE DUAL (
DUMMY CHAR(1)
)
INSERT INTO DUAL (DUMMY) VALUES ('X')
Altri RDBMS presuppongono essenzialmente che venga utilizzata una tabella fittizia se non FROM
viene specificato alcun valore .
Il storia della tabella DUAL è su Wikipedia:
La tabella DUAL è stata creata da Charles Weiss della Oracle Corporation per fornire una tabella per l'unione nelle viste interne:
Ho creato la tabella DUAL come oggetto sottostante in Oracle Data Dictionary. Non è mai stato pensato per essere visto da solo, ma invece è stato usato all'interno di una vista che avrebbe dovuto essere interrogata. L'idea era che si potesse fare un JOIN alla tabella DUAL e creare due righe nel risultato per ogni riga della tabella. Quindi, utilizzando GROUP BY, il join risultante potrebbe essere riassunto per mostrare la quantità di memoria per l'estensione DATA e per l'estensione (i) INDICE. Il nome, DUAL, sembrava adatto al processo di creazione di una coppia di righe da una sola.
La tabella DUAL originale aveva due righe (da cui il suo nome), ma successivamente aveva solo una riga.
select
senza afrom
. DB2 ha una tabella fittizia simile chiamata SYSIBM.SYSDUMMY1 . Probabilmente lo saprai già, ma quando non si accede realmenteselect 'A' from dual
alladual
tabella , che risponde alla domanda nella modifica (che meritava una nuova domanda tra l'altro).