0

可能重复:
Oracle 中的对偶表是什么?

我一直想知道查询如何:

select sysdate
from dual;

或者

select 8
from dual;

做工作。

因为我习惯于 select 语句从给定表中选择列/s 值。但在上面提到的示例中,双表没有 sysdate 或只有 '8' 列....

有人可以解释一下它是如何工作的吗?

4

2 回答 2

1

您不必选择列。您可以选择表达式,可以按列、常量值、函数调用、计算......所以您可以从员工表中选择它

select 
  e.nr,  -- column
  upper(e.name) as name, -- Function call to change the name to uppercase.
  e.age + 5 as age, -- expression with calculation with column value. 
  1  -- Just a value. Contains 1  for each row that the query returns.
from 
  employees e;

注意as nameas age。这是因为一旦表达式包含的不仅仅是列名,列名就会丢失。在这种情况下,您可以指定希望列在查询结果中的名称。表名本身也有类似的技巧。别名e只是一种简写。这在使用多个表(在连接中)时特别有用。在这个简单的查询中,表别名可以完全省略。

dual只是一个特殊的表,它有 1 行,一列名为dummy. 它有许多不同的用途,前面已经讨论过。其他一些数据库根本不需要使用dual。例如,在 MySQL 中你可以只写

select
  1;
于 2012-12-01T20:01:36.960 回答
0

这只是一张只有一行的桌子。它是由Oracle 的Charles Weiss创建的,用于提供一个用于加入 Oracle 数据字典的内部视图的表。

我在 Oracle 数据字典中创建了 DUAL 表作为基础对象。它本身并不打算被看到,而是在预期被查询的视图中使用。想法是您可以对 DUAL 表执行 JOIN,并在结果中为表中的每一行创建两行。然后,通过使用 GROUP BY,可以汇总生成的连接以显示 DATA 范围和 INDEX 范围的存储量。DUAL 这个名字似乎很适合从一个行创建一对行的过程。

您可以利用 Dual 做很多巧妙的事情。我用它来生成一个数字列表。例如

SELECT LEVEL just_a_column
FROM dual
CONNECT BY LEVEL <= 365

另请注意,从 10g 开始,Oracle 认识到 dual 的独特用途,并且 9i 和更早版本中的逻辑读取/全表扫描已针对应用程序消除。升级到 10g 对使用双重的应用程序具有显着的性能优势。(例如,从双重中选择 sysdate)。

说明计划示例:在 10g 及更高版本中,dual 是一个魔术表 - 如果您从 dual 中选择 sysdate,则计划将是:

sql> select sysdate from dual;

SYSDATE
---------
12-DEC-02


Execution Plan
-----------------------------------------------------------------
| Id  | Operation        | Name | Rows  | Cost (%CPU)| Time     |
-----------------------------------------------------------------
|   0 | SELECT STATEMENT |      |     1 |     2   (0)| 00:00:01 |
|   1 |  FAST DUAL       |      |     1 |     2   (0)| 00:00:01 |
-----------------------------------------------------------------
于 2012-12-01T20:12:08.397 回答