视图是一个常见的数据库对象,是从表中抽出的逻辑上相关的数据集合,是向用户提供基表数据的另一种形式。
视图是在已建表的基础上建立而成的,而已建表就是这视图的基表,通过select语句将基表的数据返回视图在呈现给用户
使用视图能够减少了很多的操作:简化查询,控制数据访问,避免有相同的数据
创建一个简单的视图,在create view中加入了子查询,创建了employee_id,salary,last_name三个列作为基表employees的视图数据
create view NewView as select employee_id id,salary sal ,last_name name from employees
在子查询里也可以是复杂的子查询,也可以指定某一条数据作为视图(一般是表),在选择视图的列时要使用列的别名,认为这样跟表的列名容易区分一点
视图也能够被修改,但是不是像之前的Update一样,它是使用CREATE OR REPLACE VIEW子句来对视图进行修改的,REPLACE,大概也是修改的意思的了。要注意CREATE OR REPLACE VIEW子句里的列的别名要对应子查询里的列名
create or replace view NewView(id,sal,name)
as select department_id,salary,first_name
from employees
删除视图,它并不会删除表的数据,只是删除了定义的视图
drop view newview
创建复杂视图,使用了等值连接将employees表和departments表连接起来,将department_name的平均工资查询出来,再用Group By分组,得到以下视图的结果
CREATE VIEW NewView2(name,avgsal)
AS SELECT d.department_name, AVG(e.salary)
FROM employees e, departments d
WHERE e.department_id = d.department_id
GROUP BY d.department_name;
伪列ROWNUM,查询返回的是行的编号,就像图中的1,2,3编号一样,数据还是表的数据,但是它会在每行数据前加一个编号的列,根据需要返回的条件返回多少行,而且使用rownum的时候只能使用<,<=,使用>,>=,=是无法返回数据的
例如,查询前5名最低工资的员工
SELECT rownum , last_name, salary
FROM (SELECT last_name,salary FROM employees
order by salary)
WHERE rownum<=5;
简单的视图是可以进行DML操作的,复杂视图有时也是可以的,当在以下情况时:组函数,GROUP BY 子句,DISTINCT 关键字,ROWNUM 伪列,列的定义为表达式,表中非空的列在视图定义中未包括时,不能使用DML语言处理数据。
用with read only让视图变成只读状态,DML语句在对视图进行操作时就会报出一个错误