De Wikipédia :
La table DUAL est une table spéciale à une ligne présente par défaut dans toutes les installations de base de données Oracle. Il peut être utilisé pour sélectionner une pseudocolonne telle que SYSDATE ou USER. La table a une seule colonne VARCHAR2 (1) appelée DUMMY qui a une valeur de «X».
Ainsi, la table double est un moyen d'effectuer des opérations sur ce qui équivaut à une table vide mais non nulle. Ceci est utile lorsque l'on ne se soucie pas de la table, mais doit effectuer des opérations via une instruction select. Si la table avait plus d'une ligne ou colonne, plusieurs résultats seraient retournés (en raison de l'opération sur l'ensemble des tuples lors de l'exécution de l'opération).
Il ne doit pas être utilisé en production, sauf si vous devez spécifiquement invoquer certaines procédures via SQL.
4*5
est une opération mathématique, tout comme 'Foo'
une chaîne. Ainsi, tout comme on peut sélectionner 4 * 5 dans n'importe quelle table, tout comme on peut sélectionner 'Foo' dans n'importe quelle table, DUAL est un moyen de le sélectionner à partir d'une table connue qui n'aura jamais plusieurs résultats.
De la documentation (CONCEPTS):
DUAL est une petite table dans le dictionnaire de données que la base de données Oracle et les programmes écrits par l'utilisateur peuvent référencer pour garantir un résultat connu. La table double est utile lorsqu'une valeur ne doit être retournée qu'une seule fois, par exemple, la date et l'heure actuelles. Tous les utilisateurs de la base de données ont accès à DUAL.
La table DUAL a une colonne appelée DUMMY et une ligne contenant la valeur X.
Et la référence SQL :
DUAL est une table créée automatiquement par Oracle Database avec le dictionnaire de données. DUAL est dans le schéma de l'utilisateur SYS mais est accessible par le nom DUAL à tous les utilisateurs. Il a une colonne, DUMMY, définie pour être VARCHAR2 (1), et contient une ligne avec une valeur X. La sélection dans la table DUAL est utile pour calculer une expression constante avec l'instruction SELECT. Parce que DUAL n'a qu'une seule ligne, la constante n'est renvoyée qu'une seule fois. Vous pouvez également sélectionner une constante, une pseudocolonne ou une expression dans n'importe quelle table, mais la valeur sera renvoyée autant de fois qu'il y a de lignes dans la table. Reportez-vous à "A propos des fonctions SQL" pour de nombreux exemples de sélection d'une valeur constante dans DUAL.
À partir d'Oracle Database 10g version 1, les E / S logiques ne sont pas effectuées sur la table DUAL lors du calcul d'une expression qui n'inclut pas la colonne DUMMY. Cette optimisation est répertoriée comme FAST DUAL dans le plan d'exécution. Si vous sélectionnez la colonne DUMMY dans DUAL, cette optimisation n'a pas lieu et des E / S logiques se produisent.
DUAL
est une table avec exactement une ligne, comme l'indique l'instruction SQL suivante:Votre
dual2
table ne contient aucune ligne. Si vous en insérez un, vous verrez le même comportement.4 * 5 est une expression qu'Oracle peut évaluer sans réellement utiliser les données de la table. Il l'évaluera une fois pour chaque ligne, comme il le ferait avec une expression de colonne normale. Donc, s'il n'y a pas de ligne, aucun résultat n'est renvoyé, s'il y a deux lignes, vous obtiendrez les 20 deux fois.
la source
La
dual
table "fonctionne" presque comme n'importe quelle autre table: c'est une table dans laquelle vous pouvez sélectionner des enregistrements.Cela signifie, par exemple, que vous pouvez décrire le tableau. Ici, dans
SQL*Plus
:Ainsi, la table a une colonne, nommée
dummy
qui est unvarchar2(1)
.La table a, par conception, un enregistrement (du moins si personne ne l'a manipulé):
Donc, pour obtenir le même comportement que celui
dual2
que vous avez avecdual
, vous devez insérer un enregistrement dans le double. Mieux encore, créez-le avec uncreate table as select
(ctas):Maintenant, votre requête fonctionne:
Un peu plus tôt, je l' ai dit que la double presque fonctionne comme n'importe quelle autre table. Alors, quand ça ne marche pas comme n'importe quelle autre table?
Il se comporte différemment si aucune valeur de la table elle-même n'est sélectionnée. Encore une fois, avec vos questions, je laisse Oracle expliquer ...
... afin de voir comment accéder à la table:
On peut voir que la déclaration fait un
full table access
ondual2
.Maintenant, même chose avec
dual
:C'est là que la
dual
table se comporte différemment: la valeur dedummy
n'est pas nécessaire, donc unefast dual
opération est exécutée, afin que l'instance ne lise pas la valeur réelle sur le disque.la source
Soit dit en passant, DUAL est l'une des rares «tables» qui fonctionne lorsque l'instance a été démarrée mais que la base de données n'a pas été ouverte.
Vous obtenez quelque chose comme
la source
En plus d'autres réponses, Oracle n'est pas aussi pointilleux sur le texte SQL des espaces (à certains endroits au moins). L'analyseur SQL tokenize également par les différences de classe de caractères dans certains cas, pas seulement par les espaces.
Par exemple, vous pouvez exécuter de telles instructions:
Il est également possible d'exécuter SQL sans aucun espace:
J'ai d'autres exemples ici:
http://blog.tanelpoder.com/2008/01/14/can-you-write-a-working-sql-statement-without-using-any-whitespace/
Tanel Poder
la source
Une double opération rapide réécrit votre code pour interroger x $ dual. Étant donné que cette "table" est une structure de données C dans le SGA, vous pouvez l'interroger en mode nomount.
la source
La question est déjà répondue. Ce sont quelques notes sur l'objectif du tableau double. Dual peut être utilisé pour évaluer des expressions dans une clause select. De nombreux autres systèmes de base de données n'ont pas besoin d'une telle table à cet effet. MS SQL Server, MySql, Posgres peuvent évaluer l'instruction suivante
Oracle ne peut pas. Une instruction Oracle select a toujours besoin d'une clause "from".
Certaines fonctions ne peuvent pas être utilisées dans une expression pl / sql comme DUMP .
Alors
soulèvera une exception mais
marchera.
Il peut être utilisé pour étendre le jeu de résultats d'une requête
ce qui a donné
ou générer des données avec des requêtes sélectionnées en utilisant
CONNECT BY
:ou un CTE récursif:
qui revient
à sqlfiddle
la source
Pour ce que ça vaut, cela fonctionne exactement de la même manière dans MySQL.
Et il apparaît également que DUAL est également une sorte de structure de mémoire dans MySQL. Notez la différence entre les deux plans d'explication - "aucune table utilisée" pour DUAL dans MySQL.
Cependant, je ne peux pas faire de DESC sur le dual de MySQL, qui est différent d'Oracle - mais il a été introduit spécifiquement AIUI pour permettre à la syntaxe Oracle de fonctionner sur MySQL.
la source
Dans la base de données Oracle, la table double est essentiellement utilisée pour obtenir la valeur des pseudo-colonnes. Il contient les propriétés suivantes:
Si vous souhaitez obtenir plus de détails, cochez ici
la source