Estritamente, sim, a FROM
cláusula de uma SELECT
declaração não é opcional. A sintaxe do SQL-99 detalha a SELECT
declaração básica e a FROM
cláusula não possui colchetes. Isso indica que o padrão considera não opcional:
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]
No uso real, programadores e DBAs costumam achar útil fazer outras coisas além de manipular dados em tabelas ou manipular tabelas e estruturas de dados. Esse tipo de coisa está muito além do escopo do padrão SQL, que se preocupa mais com os recursos de dados do que com as porcas e parafusos de implementações específicas. Quer desejemos executar SELECT getdate()
ou SELECT 1
ou SELECT DB_NAME()
(ou o que seu dialeto preferir), na verdade não queremos dados de uma tabela.
A Oracle decide resolver a discrepância padrão e de implementação usando uma tabela fictícia com a seguinte definição efetiva:
CREATE TABLE DUAL (
DUMMY CHAR(1)
)
INSERT INTO DUAL (DUMMY) VALUES ('X')
Outros RDBMSs assumem essencialmente que uma tabela fictícia será usada se não FROM
for especificado.
A história da tabela DUAL está na Wikipedia:
A tabela DUAL foi criada por Charles Weiss, da Oracle Corporation, para fornecer uma tabela para ingressar em visualizações internas:
Criei a tabela DUAL como um objeto subjacente no Oracle Data Dictionary. Ele nunca foi concebido para ser visto em si, mas usado dentro de uma exibição que se esperava que fosse consultada. A ideia era que você pudesse fazer uma JOIN na tabela DUAL e criar duas linhas no resultado para cada linha da sua tabela. Em seguida, usando GROUP BY, a junção resultante pode ser resumida para mostrar a quantidade de armazenamento para a extensão DATA e para a extensão INDEX. O nome, DUAL, parecia adequado para o processo de criação de um par de linhas a partir de apenas uma.
A tabela DUAL original tinha duas linhas (daí o nome), mas subseqüentemente ela só tinha uma linha.
select
sem umfrom
. O DB2 possui uma tabela fictícia semelhante chamada SYSIBM.SYSDUMMY1 . Você provavelmente já sabe disso, mas, quando vocêselect 'A' from dual
, adual
tabela não é realmente acessada , o que responde à pergunta em sua edição (que merecia uma nova pergunta).