一、普通视图和内联视图(in-line view)的关系
内联视图(in-line view):
An inline view is a SELECT statement in the FROM-clauseof another SELECT statement.
Example of inline view:
在select语句里的内联视图(in-line view),即SELECT * FROM (<select clause> ),例如
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 (<select clause> ) values (...),其具体示例如下:
insert into (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操作,但是