Strictement, oui, la FROM
clause d'une SELECT
déclaration n'est pas facultative. La syntaxe de SQL-99 détaille la SELECT
déclaration de base et la FROM
clause n'a pas de crochets autour. Cela indique que la norme considère qu'elle n'est pas facultative:
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 utilisation réelle, les programmeurs et les administrateurs de base de données trouvent souvent utile de faire autre chose que de manipuler des données dans des tableaux ou de manipuler des tableaux et des structures de données. Ce type de chose dépasse largement le cadre de la norme SQL, qui s'intéresse davantage aux fonctionnalités de données qu'aux écrous et boulons d'implémentations spécifiques. Que nous voulions exécuter SELECT getdate()
ou SELECT 1
ou SELECT DB_NAME()
(ou ce que votre dialecte préfère), nous ne voulons pas réellement de données d'une table.
Oracle choisit de résoudre l'écart standard et d'implémentation à l'aide d'un tableau factice avec la définition efficace suivante:
CREATE TABLE DUAL (
DUMMY CHAR(1)
)
INSERT INTO DUAL (DUMMY) VALUES ('X')
D'autres SGBDR supposent essentiellement qu'une table fictive est utilisée si aucun FROM
n'est spécifié.
L' histoire de la table DUAL est sur Wikipédia:
La table DUAL a été créée par Charles Weiss de la société Oracle pour fournir une table de jonction dans les vues internes:
J'ai créé la table DUAL en tant qu'objet sous-jacent dans le dictionnaire de données Oracle. Il n'a jamais été conçu pour être vu lui-même, mais plutôt utilisé à l'intérieur d'une vue qui devait être interrogée. L'idée était que vous pouviez faire un JOIN à la table DUAL et créer deux lignes dans le résultat pour chaque ligne de votre table. Ensuite, en utilisant GROUP BY, la jointure résultante peut être résumée pour afficher la quantité de stockage pour l'étendue DATA et pour les extensions INDEX. Le nom, DUAL, semblait approprié pour le processus de création d'une paire de lignes à partir d'une seule.
La table DUAL d'origine contenait deux lignes (d'où son nom), mais par la suite, elle ne comportait qu'une seule ligne.
select
sansfrom
. DB2 possède une table factice similaire appelée SYSIBM.SYSDUMMY1 . De plus, vous le savez probablement déjà, mais quand vousselect 'A' from dual
, ledual
tableau n'est pas vraiment accessible , ce qui répond à la question dans votre édition (qui méritait une nouvelle question btw).