我一直想知道查询如何:
select sysdate
from dual;
或
select 8
from dual;
做好工作。
因为我习惯选择语句从给定的表中选择列/ s值。但在例子中 上面提到的表双重DOES没有sysdate或只是'8'列......
有人可以解释一下它的运作方式吗?
答案 0 :(得分: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 name
和as age
。这是因为一旦表达式包含更多的列名称,列名就会丢失。在这种情况下,您可以指定列在查询结果中具有的名称。表名本身也有类似的技巧。别名e
只是一种简写。这在使用多个表(在连接中)时特别有用。在这个简单的查询中,表别名可以完全省略。
dual
只是一个特殊的表,其中包含一行,一列名为dummy
。它有许多不同的用途which have been discussed before。其他一些数据库根本不需要使用dual
。例如,在MySQL中你可以写
select
1;
答案 1 :(得分:0)
这只是一排一排。它由Oracle的Charles Weiss创建,用于提供加入Oracle数据字典内部视图的表。
我创建了DUAL表作为Oracle Data中的底层对象 字典。它从来没有被人看到过,而是被使用了 在一个预计会被查询的视图中。这个想法就是你 可以对DUAL表执行JOIN并在结果中创建两行 对于表中的每一行。然后,通过使用GROUP BY, 可以汇总结果连接以显示存储量 DATA范围和INDEX范围。这个名字,DUAL,似乎 适合从一个人创建一对行的过程。
你有很多可以利用双重功能的东西。我用它来生成一个数字列表。例如
SELECT LEVEL just_a_column
FROM dual
CONNECT BY LEVEL <= 365
另请注意,从10g开始,Oracle认识到其独特用途的双重性,并且9i及更早版本中的逻辑读取/全表扫描已被消除。升级到10g对于使用双重应用程序的应用程序具有显着的性能优势。 (例如,从双重选择sysdate。)
解释计划示例: 在10g及以上版本中,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 |
-----------------------------------------------------------------