数据库视图(view)

1、怎样理解视图

视图是一个从单张或多张基础数据表或其他视图中构建出来的虚拟表。同基础表一样,视图中也包含了一系列带有名称的列和行数据,但是数据库中只是存放视图的定义,也就是动态检索数据的查询语句, 而并不存放视图中的数据,这些数据依旧存放于构建视图的基础表中,只有当用户使用视图时才去数据库请求相对应的数据,即视图中的数据是在引用视图时动态生成的。

视图本质上就是一个查询语句,查看视图,就是执行其对应的SQL语句并获取查询结果,查询结果就构成了这个视图的虚拟表。

可以对视图执行SELECT查询来获取数据,也可以使用UPDATE、INSERT和DELETE等语句来修改数据(取决于视图的定义和权限,有些视图定义为不允许对其进行修改,或者修改操作可能会违反数据库的某些规则或约束。因此,有些视图只能用于查询数据,而不能用来修改基表)。

当通过视图修改数据时,实际上是在改变基表中的数据;相反地,基表数据的改变也会自动反映在由基表产生的视图中。

2、使用场景

主要用于简化查询、提高性能、隐藏敏感数据、定制用户数据和提高应用程序的逻辑清晰度。

简化复杂查询:当有复杂的查询需要重复使用时,可以创建一个视图,这样在需要该查询时可以简单地引用视图,而不需要重复编写复杂的查询语句。

提高性能:视图可以缓存其定义,当相同的查询被多次执行时,可以提高查询性能。

安全性:视图可以隐藏某些列或行,从而限制用户对基础数据的访问,尤其是涉及敏感数据时。

定制用户数据:根据用户的角色和需求,可以为不同的用户创建视图,只展示他们需要看到的数据,隐藏其他不相关的数据。

逻辑层:视图可以作为应用程序和数据库之间的逻辑层。例如,如果应用程序需要使用一些复杂的业务逻辑来查询数据,可以使用视图来实现这些逻辑,而不是在应用程序中编写这些逻辑。

3、用法举例

建表语句及数据见

数据查询语言(Data Query Language,DQL)全部语法举例(一)单表查询-CSDN博客

第1、2部分。

1)单表视图

  • 创建视图myview01:emp表中deptno为20的数据,显示empno, ename, job, deptno列
create view myview01
as select empno, ename, job, deptno from emp where deptno=20; 
-- 如果多次从这部分数据中查询,创建了视图,就不用每次都写这个查询语句了,直接从视图查询即可。
  • 查看视图myview01
select * from myview01; 
-- 多次使用的情况下,操作视图更方便
-- 操作视图本身就是操作select empno, ename, job, deptno from emp where deptno=20 这个sql语句
  • 在视图myview01中插入数据
insert into myview01 (empno,ename,job,deptno) values(1234,'SHELDON','CLERK',20);
insert into myview01 (empno,ename,job,deptno) values(2234,'LEONALD','CLERK',30);
-- 部门编号为20、30的这两条数据都可以成功添加到基表上,因为视图myview01虽然查询的是20号部门,但是未对添加做限制
  • 替换视图:使myview01限制修改操作要在deptno为20时才可以进行
create or replace view myview01
as select empno, ename, job, deptno from emp where deptno=20
with check option; 
-- create or replace:替换视图时必须这样写,如果只写create会报重名错误(上面已经创建了),如果只写replace会报语法错误
  • 替换后尝试插入deptno为30的数据
insert into myview01 (empno,ename,job,deptno) values(3234,'PENNY','CLERK',30);
-- 无法插入,报错check option failed,说明限制有效
insert into myview01 (empno,ename,job,deptno) values(3234,'PENNY','CLERK',20);
-- 部门号为20,插入成功

2)多表视图

  • 创建视图myview02:基于emp表、dept表,工资大于2000,查询员工编号、姓名、工资、部门编号、部门名
create or replace view myview02
as select e.empno, e.ename, e.sal, d.deptno, d.dname from emp e
join dept d on e.deptno = d.deptno where sal>2000;

select * from myview02; 
-- 查看视图,成功创建
  • 创建统计视图myview03:基于emp表、dept,查询部门编号、部门名、平均工资、最低工资、计数,按照部门编号分组
create or replace view myview03 
as select e.deptno,d.dname,avg(sal),min(sal),count(*)
from emp e join dept d using(deptno) group by e.deptno;
-- join using 作用类似于 join on
-- 将常用的统计数据放到视图中,便于查询
select * from myview03; 
-- 成功创建

3)基于视图的视图

-- 创建视图myview04:基于myview03虚拟表,查询部门编号为20的所有数据
create or replace view myview04 
as select * from myview03 where deptno = 20;

select * from myview04;
-- 成功创建

  • 21
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值