视图
视图是指计算机数据库中的视图,是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。
但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
why使用视图
关系型数据库中的数据是由一张一张的二维关系表所组成,简单的单表查询只需要遍历一个表,
而复杂的多表查询需要将多个表连接起来进行查询任务。对于复杂的查询事件,每次查询都需要编写MySQL代码效率低下。
为了解决这个问题,数据库提供了视图(view)功能。
创建视图
CREATE VIEW 视图名(列1,列2...)
AS SELECT (列1,列2...)
FROM ...;
使用视图和使用表完全一样,只需要把视图当成一张表就OK了。视图是一张虚拟表。
-- 视图是一张"虚拟"表
create view student_view
as select sno,sname,sgender from student;
-- 查询视图
mysql>select * from student_view;
-- 删除视图
mysql>drop view student_view;
-- 更新视图,观察视图的"源头表"
-- 更新视图的数据,会对原来的表造成影响
-- 前提:我们只能对简单的视图进行DML操作.
-- 视图分类 - 简单视图 - 视图来源于单表的查询
-- 复杂视图:视图来源于多表查询.
mysql>update student_view set sname='王玉迎' where sno = 's001';
-- 修改的原来的表,观察视图中是否发生变化.
-- 会对视图造成影响.
-- 简单视图可以看做是原来的表"镜像".
mysql>update student set sname = '小P霞' where sno = 's001';
-- 感受视图带给我们的好处!
-- 复杂的视图 - 来源于多表的查询结果
mysql> select c.*,s.* from course c join score s on c.cno = s.cno where c.cname='J2SE';
-- 复杂视图 - 但是不能执行DML操作.
-- 封装我们的多表查询
mysql>create view stu_cou_view as
select c.cno cno_,s.* from course c join score s on c.cno = s.cno
mysql>select * from stu_cou_view;
删除视图
drop view 视图名;
视图与表数据变更
-
表格数据变化后,在通过视图检索,得到的结果也同步发生了变化
-
可以通过视图插入数据,但是只能基于一个基础表进行插入,不能跨表更新数据。
WITH CHECK OPTION
如果在创建视图的时候制定了“WITH CHECK OPTION”,那么更新数据时不能插入或更新不符合视图限制条件的记录。
-- with check option一定要和where语句
-- 删除简单的视图
mysql>drop view student_view;
mysql>create view student_view
as select sno,sname,sgender from student where sno = 's001';
-- 同步更新到数据表中 - 导致视图根据原来的sno='s001'查询的结果消失
-- 如果创建的视图来源于带where条件语句的查询得到的,那么这个where的条件列
-- 应该是一定不允许被更新的.
mysql>update student_view set sno='ssss' where sno = 's001';
mysql>create view student_view
as select sno,sname,sgender from student where sno = 'ssss'
with check option;
-- 此处不允许更新where的条件列 - 为了防止视图中的数据消失.
mysql>update student_view set sno='s001' where sno = 'ssss';
表的复制
-- 创建了一个真实的表student_copy
-- 它和student互不影响的
-- student_copy表保留了student表的结构和数据.
create table student_copy
as
select * from student;
-- 只希望保留student表的结构,而不需要数据
create table student_copy2
as
select * from student where 1=2;