视图:
视图是数据库对象之一。
所有数据库对象名字不能重复,所以视图名字一般都是以"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;
删除视图本身不会影响基表数据,但是删除视图数据会对应将基表数据删除。