Estrictamente, sí, la FROM
cláusula de una SELECT
declaración no es opcional. La sintaxis para SQL-99 detalla el SELECT
enunciado básico , y la FROM
cláusula no tiene corchetes alrededor. Eso indica que el estándar lo considera no 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]
En el uso real, los programadores y los DBA a menudo encuentran útil hacer otras cosas además de manipular datos en tablas o manipular tablas y estructuras de datos. Este tipo de cosas está más allá del alcance del estándar SQL, que se ocupa más de las características de los datos que de los detalles básicos de las implementaciones específicas. Ya sea que queramos ejecutar SELECT getdate()
o SELECT 1
o SELECT DB_NAME()
(o lo que prefiera su dialecto), en realidad no queremos datos de una tabla.
Oracle elige resolver la discrepancia estándar y de implementación utilizando una tabla ficticia con la siguiente definición efectiva:
CREATE TABLE DUAL (
DUMMY CHAR(1)
)
INSERT INTO DUAL (DUMMY) VALUES ('X')
Otros RDBMS esencialmente suponen que se usa una tabla ficticia si no FROM
se especifica ninguna .
La historia de la tabla DUAL está en Wikipedia:
La tabla DUAL fue creada por Charles Weiss de Oracle Corporation para proporcionar una tabla para unirse en vistas internas:
Creé la tabla DUAL como un objeto subyacente en el Diccionario de Datos Oracle. Nunca se pensó para verse, sino que se usó dentro de una vista que se esperaba consultar. La idea era que pudieras unirte a la tabla DUAL y crear dos filas en el resultado para cada fila de tu tabla. Luego, al usar GROUP BY, la unión resultante podría resumirse para mostrar la cantidad de almacenamiento para la extensión DATA y para la extensión o extensiones INDEX. El nombre, DUAL, parecía apto para el proceso de crear un par de filas a partir de una sola.
La tabla DUAL original tenía dos filas (de ahí su nombre), pero posteriormente solo tenía una fila.
select
sin unfrom
. DB2 tiene una tabla ficticia similar llamada SYSIBM.SYSDUMMY1 . También es probable que ya lo sepas, pero cuando no se accede realmente aselect 'A' from dual
ladual
tabla , lo que responde a la pregunta en tu edición (que mereció una nueva pregunta por cierto).