SQL select语句混乱

时间:2012-12-01 19:45:11

标签: sql oracle

  

可能重复:
  What is the dual table in Oracle?

我一直想知道查询如何:

select sysdate
from dual;

select 8
from dual;

做好工作。

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

有人可以解释一下它的运作方式吗?

2 个答案:

答案 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 nameas 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 |
-----------------------------------------------------------------