视图是一个从几个基本表中导出的虚表,所以视图里没有真正的数据。数据库存放的只是视图的定义,真正的数据还是在基本表中。
作用:
1.最重要的就是查询功能,可以简化查询,将多张基本表在一个视图中展现可以简化复杂的查询操作。
2.在视图中可以以不同角度看同一个数据
3.提供一定程度的逻辑独立性,当重构数据库时,有的基本表可能被拆成多个表,但通过视图可以将表拼合起来查询,从用户角度可以继续用原语句查询。
4.安全性。对不同用户定义不同视图,可以防止用户获得其他用户的数据。
一、建立视图
(sno,sname,sage,ssex,sdept,grade)
as
select students.sno,sname,sage,ssex,sdept,grade
from students,reports
where students.sno=reporets.sno;```
建立一个叫做stu的视图,包括学生的基本信息和成绩。
```create view _students
as
select *
from students;```
建立一个叫_students的视图,视图名后面包括的列名可以省略,省略时默认使用子查询中的列名,所以在这种情况下子查询列名不能是常数,表达式或者集函数且不能有重复列名。
```create view _courses(cno,cname,sno)
as
select courses.cno,cname,sno
from courses,reports
where courses.cno=reports.cno
with check option;```
子查询可以是任意查询子句,但不能使用distinct和order by,当加上with check option时,更新视图时会DBMS会核对如果操作了之后创建试图时的select子句还能不能正确执行,如果不能执行则拒绝更新。
比如说创建了一个数学系学生信息的视图,当你想把视图中的一个学生的系改成计算机,这就破坏了当初的select子句,所以你不能修改。
```create view stu_1
as
select sno,sname,sdept
from stu
where grade>90;```
建立在视图上的视图;
*注意:建立视图的子查询中尽量不要select * ,因为如果基本表中的列数发生变化时会导致视图无法工作。*
>视图查询
1.视图实体化法。
先实例化视图,也就是从基本表中查出一个临时表,然后再根据查询条件在临时表中查找数据。
2.视图消解法。
将查询语句与视图的定义相结合,生成对基本表的查询语句,再到基本表中查出数据。
```select *
from stu
where grade>90;```
和对基本表的查询语法相同。
>视图更新
*视图更新和基本表的更新基本一致,但有几种情况不能进行更新:
1.不满足with check option
2.涉及两个表及以上的视图不允许更新(牵一发而动全身,你想更新一条数据多个表都得变)
3.即使只涉及一个表,但定义中使用了嵌套查询且嵌套查询的子查询所用的表和父查询的表相同则不能更新
4.视图的列是集函数构成则不能更新(因为基本表里根本没有这一列)
5.不能更新的视图上建立的视图也不能更新
6.定义中含有distinct和order by的视图不能更新。*
```update stu
set sname='233'
where sno='s01';```
修改数据;
```delete stu
where sno='s01';```
删除数据;
```insert into _students
values('s10','hh','女','19','数学');```
插入数据。
>删除视图。
```drop view stu;```