可能重复:
Oracle 中的对偶表是什么?
我一直想知道查询如何:
select sysdate
from dual;
或者
select 8
from dual;
做工作。
因为我习惯于 select 语句从给定表中选择列/s 值。但在上面提到的示例中,双表没有 sysdate 或只有 '8' 列....
有人可以解释一下它是如何工作的吗?
可能重复:
Oracle 中的对偶表是什么?
我一直想知道查询如何:
select sysdate
from dual;
或者
select 8
from dual;
做工作。
因为我习惯于 select 语句从给定表中选择列/s 值。但在上面提到的示例中,双表没有 sysdate 或只有 '8' 列....
有人可以解释一下它是如何工作的吗?
您不必选择列。您可以选择表达式,可以按列、常量值、函数调用、计算......所以您可以从员工表中选择它
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 name
和as age
。这是因为一旦表达式包含的不仅仅是列名,列名就会丢失。在这种情况下,您可以指定希望列在查询结果中的名称。表名本身也有类似的技巧。别名e
只是一种简写。这在使用多个表(在连接中)时特别有用。在这个简单的查询中,表别名可以完全省略。
dual
只是一个特殊的表,它有 1 行,一列名为dummy
. 它有许多不同的用途,前面已经讨论过。其他一些数据库根本不需要使用dual
。例如,在 MySQL 中你可以只写
select
1;
这只是一张只有一行的桌子。它是由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 |
-----------------------------------------------------------------