数据库六-视图

视图:

视图是数据库对象之一。

所有数据库对象名字不能重复,所以视图名字一般都是以"V_"开头。

视图在SQL语句中体现的角色与表相同,但是视图并不是一张真实存在的表,而只是对应一个SELECT语句的查询结果集,并将其当做表看待而已。

使用视图的目的是简化SQL语句的复杂度,重用子查询,限制数据访问。

创建视图:

该视图包括的数据为10号部门的员工信息?

CREATE VIEW v_emp_10

AS

SELECT empno,ename,sal,deptno

FROM emp

 WHERE deptno = 10;

查看视图数据?

SELECT * FROM v_emp_10;

DESC v_emp_10;

视图对应的子查询中的字段若含有函数或者表达式,那么该字段必须指定别名。当视图对应的子查询中的字段使用了别名,那么视图中该字段就用别名来命名。

修改视图:

由于视图仅对应一个SELECT语句,所以修改视图就是替换该SQL语句而已。

CREATE OR REPLACE VIEW v_emp_10

AS

SELECT empno id ,ename name ,sal salary,deptno 

FROM emp

 WHERE deptno = 10;



根据视图所对应的子查询种类分为几个类型:

---SELECT语句是基于单表建立的,且不不包括任何函数运算、表达式或分组函数,叫做简单视图,此时视图是基表的子集。

---SELECT语句同样是基于单表,但包含了单行函数、表达式、分组函数或GROUP BY子句,叫做复杂视图

---SELECT语句是基于多个表的,叫做连接视图


对视图进行DML操作:

仅能对简单的视图进行DML操作。对视图进行DML操作就是对视图数据来源的基础表进行的操作。

对视图的DML操作就是对基表操作,那么操作不当可能对基表进行数据污染。

(例如往视图中插入数据是视图未查询的内容模块,视图不可见,而表中又存在)

更新同样存在更新后对数据不可控的情况。

删除是不会对基表产生数据污染的,因为数据不在视图内则无法删除。


为视图添加检查选项,可以保证对视图的DML操作后视图对其可见,否则不允许进行该DML操作,这样就避免了对基表进行数据污染。

CREATE OR REPLACE VIEW v_emp_10

AS

SELECT empno id ,ename name ,sal salary ,deptno 

FROM emp

 WHERE deptno = 10

WITH CHECK OPTION;(限制操作,若超出视图范围则无法操作,是为约束条件)


为视图添加只读选项,那么该视图不允许进行DML操作。

CREATE OR REPLACE VIEW v_emp_10

AS

SELECT empno id ,ename name ,sal salary ,deptno 

FROM emp

 WHERE deptno = 10

WITH READ ONLY


通过查询user_views获取相关信息:

数据字典对应的其实就是一张表,其中是数据库自动记录的用户的操作,我们不要主动去修改表中结构及内容。

在查询数据字典的过程当中,大小写不管怎么书写,在数据库中都会转成大写来操作。

--和视图相关的数据字典:

       --- USER_OBJECTS  曾经创建过的所有对象

       --- USER_VIEWS     曾经创建过的所有视图

       --- USER_UPDATE_COLUMNS

--在数据字段USER_OBJECTS中查询所有视图名称?

 SELECT object_name FROM user_objects 

                    WHERE object_type = 'VIEW';


SELECT TEXT, view_name FROM user_views;

TEXT指代的是视图对应的SQL语句。

SELECT table_name FROM user_tables;

指代的是曾经创建过的所有表。



复杂视图:

创建一个含有公司部门工资情况的视图,内容为:部门编号,部门名称,部门的最高,最低,平均,以及工资总和信息。

CREATE VIEW v_dept_sal 

AS

SELECT d.deptno, d.dname,

             MAX(e.sal) max_sal,

             MIN(e.sal) min_sal,

             AVG(e.sal) avg_sal,

             SUM(e.sal) sum_sal

FROM emp e , dept d

WHERE e.deptno=d.deptno

GROUP BY d.deptno,d.dname;     (子查询中聚合函数以外的字段都需要加在分组中)

查看谁比自己所在部门平均工资高?

SELECT e.ename , e.sal, e.deptno FROM emp e, v_view_sal v

WHERE e.deptno = v.deptno AND e.sal > v.avg_sal;


删除视图:

-当不再需要视图的定义,可以使用DROP VIEW 语句删除视图。

    DROP VIEW view_name;

-删除视图v_view_10;

DROP VIEW v_view_10;

删除视图本身不会影响基表数据,但是删除视图数据会对应将基表数据删除。





版权声明:本文为Nishino_shou原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。