视图
视图:
视图也被称为虚表,也就是虚拟的表,是一组数据的逻辑表示。
视图相对应于一条SELECT语句,结果集被赋予一个名字,即视图名字。
视图本身并不包含任何数据,它只是映射到基础表的一个查询语句,当基础表数据发生变化时,视图数据也会随之发生变化。
自我理解:视图其实就好比java中的方法一样,写好之后谁需要谁调用就好。
视图的命名:所有数据库对象名字不能有重复,一般约定俗成:V_名字_条件。
视图分为两种:1.简单视图 2.复杂视图
1.简单视图(没有添加任何函数处理)
创建简单视图
--重要
CREATE VIEW V_EMP_1 as SELECT ENAME,EMPNO,SAL,DEPTNO FROM EMP WHERE DEPTNO=10;
结果如下:
简单视图可以进行DML操作。
--给别名 当视图中字段有了别名 就用别名来命名 CREATE OR REPLACE VIEW V_EMP_2 as SELECT ENAME,EMPNO ,SAL,DEPTNO FROM EMP WHERE DEPTNO=20 WITH CHECK OPTION;
--从视图中插入数据 INSERT INTO V_EMP_2 (ENAME,EMPNO,SAL,DEPTNO) VALUES('LIUSHE',50,6626,10);
注意:上面代码又创建了一个简单视图,第二部分是插入数据。但是插入数据后,在视图中是找不到这个记录的,在基础表中可以找到该记录???
答:
注意:该图片中10和20 是相反的 ,但是意思是一样的。
WITH CHECK OPTION 检查如果数据可以在视图内显示 ,不会报错 不可以就报错。
注意注意注意(重要的是说三遍):插入数据时一定要注意数据类型,和过滤条件,如果不注意,会出现数据污染(基础表内数据发生变化,但视图内数据不发生变化),数据的添加和修改都可能会造成数据污染,但是删除不会造成数据污染。一定要用WITH CHECK OPTION检查是否可以。
WITH CHECK OPTION检查如果不成功会直接报错。
例:
2.复杂视图(同样是基于单表,但包含了单行函数、表达式、分组函数或GROUP BY字句)
创建复杂视图
--创建复杂视图 创建一个含有部门工资情况的视图 --内容为 部门编号 部门名称 部门最高 最低 平均 以及工资总和 和信息 CREATE OR REPLACE VIEW V_DE_S AS SELECT D.DEPTNO,D.DNAME,MIN(E.SAL) MINSA,MAX(E.SAL) MAXSA,AVG(E.SAL) AVGAS,SUM(E.SAL) SUMSA 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_DE_S V WHERE E.DEPTNO=V.DEPTNO AND E.SAL>V.AVGAS;
最后视图的操作:
删除视图:删除视图本身不会影响基础表的数据,但是删除视图数据会影响基础表。
DROP VIEW 视图名
简单视图可以进行DML操作,复杂视图不可以进行DML操作。
ok视图部分完毕。