MySQL视图

视图

视图是指计算机数据库中的视图,是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。

但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。

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 视图名;

视图与表数据变更

  1. 表格数据变化后,在通过视图检索,得到的结果也同步发生了变化

  2. 可以通过视图插入数据,但是只能基于一个基础表进行插入,不能跨表更新数据。

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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值