SQL> desc dual
Name Null? Type
----------------------------------------- -------- ----------------------------
DUMMY VARCHAR2(1)
SQL> select 4*5 from dual;
4*5
----------
20
SQL>
我觉得真的很奇怪。如果对偶中没有名为 4*5 的列,那么 select 语句是如何工作的?
另外,为什么我在创建自己的双表时看不到相同的行为?
SQL> create table dual2(dummy varchar2(1));
Table created.
SQL> desc dual2
Name Null? Type
----------------------------------------- -------- ----------------------------
DUMMY VARCHAR2(1)
SQL> select 4*5 from dual2;
no rows selected
SQL>
来自维基百科:
因此,对偶表是一种针对空表而不是空表执行操作的方法。当不关心表,但需要通过 select 语句执行操作时,这很有用。如果表有多个行或列,则将返回多个结果(由于在执行操作时对整个元组集进行了操作。)
它不应该在生产中使用,除非您特别需要通过 SQL 调用某些过程。
4*5
是一种数学运算,就像'Foo'
字符串一样。因此,正如人们可以从任何表中选择 4*5 一样,就像人们可以从任何表中选择“Foo”一样,DUAL 是一种从永远不会有多个结果的已知良好表中选择它的方法。从文档(概念):
和SQL 参考:
DUAL
是一个只有一行的表,如以下 SQL 语句所示:您的
dual2
表没有行。如果插入一个,您将看到相同的行为。4*5 是一个表达式,Oracle 可以在不实际使用表中的数据的情况下进行计算。它将为每一行评估一次,就像它对普通列表达式所做的那样。因此,如果没有行,则不返回任何结果,如果有两行,您将获得 20 两次。
该
dual
表“工作”几乎与任何其他表的工作方式一样:它是一个可以从中选择记录的表。这意味着,例如,您可以描述表格。在这里,在
SQL*Plus
:因此,该表有一个列,命名
dummy
为varchar2(1)
.根据设计,该表有一条记录(至少在没有人摆弄它的情况下):
因此,为了获得与 相同的行为,
dual2
您dual
必须将一条记录插入到对偶中。create table as select
更好的是,使用(ctas)创建它:现在,您的查询有效:
早些时候,我说过 dual几乎可以像任何其他表一样工作。那么,它什么时候不能像其他任何表一样工作?
如果没有选择表本身的值,它的行为会有所不同。同样,对于您的查询,我让 Oracle解释它们......
...为了查看表的访问方式:
可以看出该语句做了一个
full table access
ondual2
。现在,同样的事情
dual
:这是
dual
表表现不同的地方:dummy
不需要 的值,因此fast dual
执行了一个操作,以便实例不读取磁盘上的实际值。顺便说一句,DUAL 是在实例已启动但数据库尚未打开时工作的少数“表”之一。
你得到类似的东西
除了其他答案之外,Oracle 对空格 SQL 文本并不那么挑剔(至少在某些地方)。在某些情况下,SQL 解析器还通过字符类差异进行标记,而不仅仅是空格。
例如,您可以运行这样的语句:
也可以在没有任何空格的情况下运行 SQL:
我这里还有一些例子:
http://blog.tanelpoder.com/2008/01/14/can-you-write-a-working-sql-statement-without-using-any-whitespace/
塔内尔·波德
快速对偶操作会重写您的代码以查询 x$dual。因为这个“表”是SGA中的C数据结构,所以可以在nomount模式下查询。
问题已经回答了。这些是对双表目的的一些说明。Dual 可用于计算 select 子句中的表达式。许多其他数据库系统不需要这样的表来达到这个目的。MS SQL Server、MySql、Posgres 可以评估以下语句
甲骨文不能。Oracle select 语句总是需要一个“from”子句。
某些函数不能在 pl/sql 表达式中使用,例如DUMP。
所以
将引发异常但
将工作。
它可用于扩展查询的结果集
这给了
或使用选择查询生成数据
CONNECT BY
:或递归 CTE:
返回
在sqlfiddle
对于它的价值,它在 MySQL 中的工作方式完全相同。
而且似乎 DUAL 也是 MySQL 中的某种内存结构。请注意两个解释计划的区别——MySQL 中 DUAL 的“未使用表”。
然而有趣的是,我不能在 MySQL 的 dual 上做 DESC,这与 Oracle 不同——但它是专门引入的 AIUI 以允许 Oracle 语法在 MySQL 上工作。
在 oracle 数据库中,Dual table 主要用于获取伪列的值。它包含以下属性:
如果您想了解更多详细信息,请查看此处