oracle内联视图子查询,内联视图和普通视图的关系以及和子查询的区别

一、普通视图和内联视图(in-line view)的关系

内联视图(in-line view):

An inline view is a SELECT statement in theFROM-clauseof another SELECT statement.

Example of inline view:

在select语句里的内联视图(in-line view),即SELECT * FROM ( ),例如

SELECT * FROM ( SELECT deptno, count(*) emp_count FROM emp GROUP BY deptno ) emp, dept WHERE dept.deptno = emp.deptno;

其中,

( SELECT deptno, count(*) emp_count FROM emp GROUP BY deptno )就是所谓的内联视图(in-line view)。

在DML语句里的内联视图(in-line view),例如

insert into ( ) values (...),其具体示例如下:

insertinto (select object_id,object_name,object_type from xxx where object_id<1000)values(1001,'testbyhao','testtype');

普通视图

我们平时说的视图指的是create view语句创建的视图类型,我们暂且称其为普通视图。例如,

CREATE  VIEW     empvu30

AS SELECT  employee_id, last_name, salary

FROM    employees

WHERE   department_id = 30;

普通视图本质上还是内联视图(in-line view),因为在执行包含普通视图的SQL语句时,普通视图都会最终转化为内联视图(in-line view)。例如,

在select语句里的普通视图,例如,

SELECT *  FROM    empvu30;

最终转化为

SELECT *  FROM(SELECT  employee_id, last_name, salary  FROM    employees WHERE   department_id = 30);

在DML语句里的普通视图,例如,

insert into  empvu30 values(129,‘jak’,50000);

最终转化为

insert into(SELECT  employee_id, last_name, salary  FROM    employees WHERE   department_id = 30) values(129,‘jak’,50000);

二、内联视图(in-line view)和子查询的区别

内联视图(in-line view)(各种类型的视图本质上都是内联视图)不同于子查询的地方在于

子查询(可以视之为)是一个中间结果集,但是内联视图(in-line view)不可这么认为。这点可以从

如insert into (select object_id,object_name,object_typefrom xxxwhereobject_id<1000)values(999,'testbyhao','testtype');时看出,因为一个select语句执行所得的结果集是只能读取而不能被修改的,即不支持DML操作,但是内联视图(in-line view)却又是支持DML操作,所以说从内联视图(in-line view)这个特性来看,它更像是表,只不过内联视图(in-line view)没有实际的数据,视图的全部家当,也就是你创建视图时的SELECT语句,故而我们可以将内联视图(in-line view)视为一张虚拟的表。

注释:

View

A view is a named and validated SQL query which is stored in the Oracle data dictionary. Views do not contain any data - it is just a stored query in the database that can be executed when called. One can think of a view as a virtualtable or mapping of data from one or more tables.

参见:http://www.orafaq.com/wiki/View

下面的实验证明了内联视图(in-line view)更像是表而不是子查询:

为什么说内联视图(in-line view)没有实际执行呢?看统计信息吧:

SQL> set autotrace trace expstat

SQL> select object_id,object_name,object_type from xxx where object_id<1000;955rows selected.97consistent gets

这是一个结果集,有955rows selected(被选择了).

SQL>create table ts as (select object_id,object_name,object_type from xxx where object_id<1000);

SQL> insert into ts values(999,'testbyhao','testtype');1row created.1 consistent gets SQL> insert into (select object_id,object_name,object_type from xxx where object_id<1000)2 values(999,'testbyhao','testtype');1row created.1 consistent gets 从这里看出,

内联视图(in-line view)的特性更像是表而不是子查询,因为

insert into 内联视图(in-line view)时的统计信息说明内联视图(in-line view)没有像子查询那样实际执行而获得一个含有955行数据的结果集。insert into 内联视图(in-line view)时的统计信息显示1 row created.即新创建了一行数据在视图里,

这个和insert into 表时的统计信息一样。注释:内联视图(in-line view)中内联的意思在主查询语句中内联视图(in-line view):( SELECT deptno, count(*) emp_count FROM emp GROUP BY deptno )是直接将其源码( SELECT deptno, count(*) emp_count FROM emp GROUP BY deptno )嵌入主查询语句中,而普通视图,如名为empvu30的视图: CREATE  VIEW     empvu30  AS SELECT  employee_id, last_name, salary  FROM    employees WHERE   department_id = 30; 是将视图名empvu30嵌入主查询语句中,而不是其源码SELECT  employee_id, last_name, salary  FROM    employees WHERE   department_id = 30;所以,内联视图(in-line view)中内联的意思就是直接将内联视图源码嵌入主查询语句里的意思。 内联函数中内联的意思也是如此,即直接将内联函数的函数体源码嵌入到类中,而不是在类中只是声明了函数头,没有函数体。 这样,可以避免在类中只是声明了函数头而没有函数体时要保护现场后去切换调用函数体的开销,从而提高执行速度。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值