视图——MySQL

视图

  • 视图:是一个虚拟表,非真实存在,其本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用视图名称即可获取结果集,并可以将其当作表来使用
  • 数据库中只存放了视图的定义,而并没有存放视图中的数据。这些数据存放在原来的表中
  • 使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。因此,视图中的数据是依赖于原来的表中的数据的。一旦表中的数据发生改变,显示在视图中的数据也会发生改变

创建视图

视图语法:

create [or replace] 
view 视图名称 [(列表名称)]
as 
select语句
  • or replace:用于替换某个视图
  • view:表示创建的是视图
  • as:视图是一个虚拟表,最终数据来自于select语句

例子:创建视图,视图为emp表中的ename和job列

create or replace 
view view1_emp
as 
select ename,job from emp; 
 查看表和视图 
show full tables

查询视图

查看创建视图语句:show create view 视图名称;
查看视图数据:select * from  视图名称

修改视图

方法一:alter view 视图名 as select语句;
方法二:create or replace view 视图名;
方法二是靠or replace 来替换掉视图

删除视图

drop view [if exists] 视图名 [,视图名];

更新视图

  • 更新视图
create or replace view view1_emp
as 
select ename,job from emp;

update view1_emp set ename = '周瑜' where ename = '鲁肃';  -- 可以修改
insert into view1_emp values('孙权','文员');  -- 不可以插入

要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。

如果视图包含以下任何一项,则该视图不可更新:

  1. 聚合函数或窗口函数(SUM()、 MIN()、 MAX()、 COUNT()等)
  2. distinct
  3. group by
  4. having
  5. union 或者 union all

视图不可更新

  • 视图包含聚合函数不可更新
create or replace view view2_emp
as 
select count(*) cnt from emp;
 
insert into view2_emp values(100);
update view2_emp set cnt = 100; 
  • 视图包含distinct不可更新
create or replace view view3_emp
as 
select distinct job from emp;
 
insert into view3_emp values('财务');
  • 视图包含goup by 、having不可更
create or replace view view4_emp
as 
select deptno ,count(*) cnt from emp group by deptno having  cnt > 2;
 
insert into view4_emp values(30,100);
  • 视图包含union或者union all不可更新
create or replace view view5_emp
as 
select empno,ename from emp where empno <= 1005
union 
select empno,ename from emp where empno > 1005;
insert into view5_emp values(1015,'韦小宝');
  • 视图包含子查询不可更新
create or replace view view6_emp
as 
select empno,ename,sal from emp where sal = (select max(sal) from emp);
 
insert into view6_emp values(1015,'韦小宝',30000);

视图的检查选项

当我们创建视图的时候,有筛选条件,然后我们向视图里插入数据的时候,由于视图是虚拟的,不存在的,所以插入视图的数据会插入到原表当中,但是如果插入的数据不满足数据创建时的筛选条件时,会插入到原表当中但是不会再是视图中显示,为避免这种事件的发生,检查选项可以组织不满足视图创建条件的命令执行。

语法:
在创建视图的语句后面直接添加with cascaded check option或者with local check option
当加上了检查选项之后,在向视图中添加数据的时候会检查是否满足筛选条件

creat view v1 as select id,name from student where id<=20;

creat view v2 as select id,name from v1 where id>=15 with cascaded check option ;

creat view v3 as select id,name from v2 where id>=10 with cascaded check option ;

当向v3表中添加数据的时候,v3有检测选项,需要检测数据是否可行,然后递归的向上找,找到v2后需要检测,进行检测,然后再递归的向上找,找到v1,v1没有检测选项,不需要检测

视图作用

  1. 简单
    视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件。

  2. 安全
    数据库可以授权,但不能授权到数据库特定行和特定的列上。通过视图用户只能查询和修改他们所能见到的数据

  3. 数据独立
    视图可帮助用户屏蔽真实表结构变化带来的影响。

视图的案例

1). 为了保证数据库表的安全性,开发人员在操作tb_user表时,只能看到的用户的基本字段,屏蔽手机号和邮箱两个字段

create view tb_user_view 
as 
select id,name,profession,age,gender,status,createtime
from tb_user;

select * from tb_user_view;

2). 查询每个学生所选修的课程(三张表联查),这个功能在很多的业务中都有使用到,为了简化操作,定义一个视图。

create view tb_stu_course_view 
as 
select s.name student_name , s.no student_no ,c.name course_name 
from student s, student_course sc , course c 
where s.id =sc.studentid and sc.courseid = c.id;

select * from tb_stu_course_view;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值