目录
视图是基于查询的虚拟表,是一个逻辑表,本身并不包含数据。同真实的表一样,视图包含一系列带有名称的列和行数据,在使用视图时动态生成。视图就是一条SELECT语句执行后返回的结果集。
SELECT所查询的表称为视图的基表,而查询的结果集称为虚拟表,视图本身并不存储具体的数据,视图的数据存在于视图的基表中,基本表数据发生了改变,视图的数据也会跟着变化。
使用视图是为了方便复杂的查询语句。基本思路是将复杂的查询语句定义在视图内部,然后对视图进行查询,从而简化复杂的查询语句。
为什么要使用视图?
视图的诸多优点如下:
- CREATE VIEW 视图名
- AS
- SELECT列1,列2...
- FROM 表;
修改视图:
ALTER VIEW 视图名 AS SELECT 语句
显示视图创建:
SHOW CREATE VIEW 视图名;
查看视图:
- SHOW TABLES;
- -- 当作普通表使用
删除视图:
DROP VIEW 视图名[,视图名...];
重命名视图:
RENAME TABLE 视图名 TO 新视图名;
需求:查询员工信息,要求显示员工编号、姓名、所属的部门。
- select empno,ename,dname
- from emp inner join dept on emp.deptno=dept.deptno;
这是两张表连接查询,如果查询涉及的表越多,查询变得越复杂。
定义视图:
- CREATE VIEW v_emp
- AS
- SELECT empno,ename,dname FROM emp INNER JOIN dept ON emp.deptno = dept.deptno;
使用试图:
select * from v_emp
insert into v_emp(empno,dname) values(10,'测试') ;
3. 可以通过视图修改数据,但只能基于一个基表进行修改,不能同时修改多个基表的数据。
4. 可以通过视图删除数据,但只能删除单表查询的视图,不能删除多表连接查询视图中的数据。
5.虽然通过视图也可以对数据进行添加、删除、修改,但不推荐。
6.使用drop view语句可以删除视图。
7.select语句不能引入系统或用户变量。
- CREATE [OR REPLACE] [ALGORITHM={UNDEFINED | MERGE | TEMPTABLE}] VIEW 视图名[(列1,列
- 2...)] AS SELECT (列1,列2...)
- [WITH [CASCADE | LOCAL] CHECK OPTION]
缺省algorithm选项等同于algorithm=undefined
update时,要保证数据update之后能被视图查询出来,也就是要符合where的条件
insert时,保证insert的数据能被视图查询出来。
delete时,有无with check option都一样
对于没有where字句的视图,使用with check option是多余的。
- -- 没有 with check option
- create view v_emp
- as select * from emp;
- -- 有 with check option, 视图 sql 中没有 where 所以 with check option 没啥作用
- create or replace view v_emp
- as select * from emp with check option; -- 相当于 with cascaded check option
- -- 有 with check option
- create or replace view v_emp
- as select * from emp where sal > 2000
- with check option;
- select * from v_emp;
- -- 修改视图值
- update v_emp set sal = 2100 where empno = 7788;
- -- 通过原表修改
- update emp set sal = 10 where empno = 7788;
- -- with local check option cascaded
- create or replace view v_emp
- as select * from emp where sal > 2000;
- create or replace view v_v_emp as select * from v_emp where sal > 1000 with local
- check option;
- select * from v_v_emp;
- -- local 只管当前视图
- update v_v_emp set sal = 1900 where empno = 7788;
- -- cascaded 表示底层视图也要验证
- create or replace view v_emp
- as select * from emp where sal > 2000;
- create or replace view v_v_emp as select * from v_emp where sal > 1000 with cascaded
- check option;
- update v_v_emp set sal = 1900 where empno = 7788;