一、视图的概念
1.视图是一个虚拟表,视图并不在数据库中存储数据值,数据库中只在数据字典中存储对视图的定义。
2、创建视图的语句
CREATE [OR REPLACE]VIEW view_name [(column_name1[,column_name2…])] AS select_statement [WITH CHECK OPTION] [WITH READ ONLY]
3、参数说明
CREATE OR REPALCE:修改视图的定义,其实质是删除原视图并重建该视图,但是会保留该视图上授予的各种权限。如果Oracle数据库中并没有该视图,直接create就可以。
WITH CHECK OPTION :表示对视图的操作必须满足子查询中的约束条件。
WITH READ ONLY :用于创建只读视图
二.创建修改视图
1、创建简单视图
简单视图指基于单个表并且不包含函数或表达式的视图,在该视图上可以执行DML语句。
例1:创建视图V_emp,用于查询员工的员工编号、姓、名、电话
CREATE VIEW V_emp AS SELECT Employee_ID ,Last_Name, First_Name , phone_number FROM Employees
查询创建的视图信息用数据字典user_views
例2:使用视图,请在视图V_emp中完成以下操作:
1)查询该视图所有信息。SELECT * FROM V_emp;
2)向该视图中插入记录:INSERT INTO V_emp values(employees_seq.nextval,’zhang’,’huan’,’123456’);
2、创建复杂视图
复杂视图指包含函数、表达式或者分组数据的视图,在该视图上执行DML语句时必须要符合特定条件。
注:在定义复杂视图时必须为函数或表达式定义别名
例3:创建视图V_orderdetail,用于查询每个产品的销售总数量和销售总金额
CREATE VIEW V_orderdetail AS SELECT ProductID , sum(quantity) total_quantity, sum(quantity*unitprice) total_price FROM Orderdetails GROUP BY ProductID
例4:使用视图V_orderdetail,查询产品编号为10的产品的销售总数量和销售总金额
实现语句:
SELECT * FROM V_orderdetail WHERE productid=10;
查询视图中的某个列是否允许进行更新操作需要查询数据字典User_updatable_columns
3、创建连接视图
连接视图指基于多个表建立的视图,一般来说不会在该视图上执行INSERT、UPDATE、DELETE操作。
例5:创建视图V_ord_ordetail,用于查询每个订单的订单编号、经销商编号、订购日期、订购的产品编号、产品名称、订购数量、订购单价。
实现的语句为:
CREATE OR REPLACE VIEW V_ord_ordetail AS SELECT o.orderid,customerid,orderdate,p.productid,productname,quantity,od.unitprice FROM orders o JOIN orderdetails od ON o.orderid=od.orderid JOIN products p ON od.productid=p.productid;
例6: 创建视图v_depart_empl,查询在“Sales”部门任职的员工的员工号、员工姓名、部门名称dname、职位名称job、工资sal和奖金信息
create view v_depart_empl as select empno,ename,sal,comm,dname,d.deptno from emp e join dept d on e.deptno=d.deptno;
4、创建只读视图
只读视图指只允许进行SELECT操作的视图,在创建该视图时指定WITH READ ONLY选项。
注:该视图上不能执行INSERT、UPDATE、DELETE操作。
例7:建立一个只读视图V_ord_prod,要求查询产品表中类别编号为2的产品编号、产品名称、产品单价,类别编号。
实现的语句为:
CREATE OR REPLACE VIEW V_ord_prod AS SELECT productid,productname,unitprice,categoryid FROM products WHERE categoryid=2 WITH READ ONLY
5、创建CHECK约束视图
WITH CHECK OPTION用于在视图上定义CHECK约束,即在该视图上执行INSERT或UPDATE操作时,数据必须符合查询结果.
例8:建立一个带CHECK约束的视图V_check_prod,要求查询产品表中类别编号为2的产品编号、产品名称、产品单价,类别编号。
实现的语句为:
CREATE VIEW v_check_prod (产品编号,产品名称,单价,类别) AS SELECT productid,productname,unitprice,categoryid FROM products WHERE categoryid=2 WITH CHECK OPTION
查询该视图各列的可更新性:
select column_name,updatable,insertable,deletable from user_updatable_columns where table_name=' V_CHECK_PROD ‘
三. 删除视图
删除视图的语句格式:
DROP VIEW view_name;
例9:将视图t_view删除
实现语句:
DROP VIEW t_view;