数据库的视图

数据库的视图

一、什么是视图?

视图是从一个或几个基本表(或视图)中导出的虚拟的表。在系统的数据字典中仅存放了视图的定义,不存放视图对应的数据。
视图是原始数据库数据的一种变换,是查看表中数据的另外一种方式。可以将视图看成是一个移动的窗口,通过它可以看到感兴趣的数据。 视图是从一个或多个实际表中获得的,这些表的数据存放在数据库中。那些用于产生视图的表叫做该视图的基表。一个视图也可以从另一个视图中产生。
视图的定义存在数据库中,与此定义相关的数据并没有再存一份于数据库中。通过视图看到的数据存放在基表中。
视图看上去非常像数据库的物理表,对它的操作同任何其它的表一样。当通过视图修改数据时,实际上是在改变基表中的数据;相反地,基表数据的改变也会自动反映在由基表产生的视图中。由于逻辑上的原因,有些视图可以修改对应的基表 (即 基本表),而有些则不能(仅仅能查询 如由多张表构建的视图)。

二、基本表和视图两者的区别

基本表:是数据库中永久存储的表,并且基表就是实际存在的表,它是实际存储数据的逻辑表示;
基本表的定义指建立基本关系模式,
而变更则是指对数据库中已存在的基本表进行删除与修改

区别:
1、视图是已经编译好的sql语句。而表不是
2、视图没有实际的物理记录。而表有。
3、表是内容,视图是窗口
4、表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时对它进行修改,但视图只能有创建的语句来修改
5、表是内模式,试图是外模式
6、视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,
视图可以不给用户接触数据表,从而不知道表结构。
7、表属于全局模式中的表,是实表;视图属于局部模式的表,
是虚表。
8、视图的建立和删除只影响视图本身,不影响对应的基本表。
联系:视图(view)是在基本表之上建立的表,它的结构(即所定义的列)和内容(即所有数据行)都来自基本表,它依据基本表存在而存在。一个视图可以对应一个基本表,也可以对应多个基本表。
视图是基本表的抽象和在逻辑意义上建立的新关系。

三、为什么要用视图

1.视图与查询的区别

视图和查询都是用由sql语句组成,这是他们相同的地方,但是视图和查询有着本质区别:
  它们的区别在于:
  
  1:存储上的区别:视图存储为数据库设计的一部分,而查询则不是.
  
  2:更新限制的要求不一样
  要注意:因为视图来自于表,所以通过视图可以间接对表进行更新,我们也可以通过update语句对表进行更新,但是对视图和查询更新限制是不同的,以下我们会知道虽然通过视图可以间接更新表但是有很多限制.
  
  3:排序结果:通过sql语句,可以对一个表进行排序,而视图则不行。

2.视图的优点

1:为用户集中数据,简化用户的数据查询和处理。有时用户所需要的数据分散在多个表中,定义视图可将它们集中在一起,从而方便用户的数据查询和处理

2:屏蔽数据库的复杂性。用户不必了解复杂的数据库中的表结构,并且数据库表的更改也不影响用户对数据库的使用

3:简化用户权限的管理。只需授予用户使用视图的权限,而不必指定用户只能使用表的特定列,也增加了安全性

4:便于数据共享。各用户不必都定义和存储自己所需的数据,可共享数据库的数据,这样同样的数据只需存储一次

5:可以重新组织数据以便输出到其他应用程序中

3.视图的创建和管理

创建

格式:create view 视图名 as sql语句;

删除

格式:drop view 视图名;

说明:与删除表不同的是,删除视图后只是删除了视图了定义,并没有删除表中的数据.
  修改视图的定义

修改视图

格式:alter view 视图名 as sql语句;

修改案例1

1.先定义一张产品表
create table product(
id int PRIMARY key auto_increment,
pName varchar(30) not null unique,
price float default 0,
tid int
);
插入数据:
insert into product (pName,price,tid) values (‘电脑’,12322,1);
insert into product (pName,price,tid) values (‘西服’,12,2);
在这里插入图片描述

2.然后再定义一张产品分类表:
create table type(
id int PRIMARY key auto_increment,
tname varchar(30) not null unique
);
插入数据:
insert into type (tname) values (‘电子产品’);
insert into type (tname) values (‘服装’);
在这里插入图片描述

3.创建视图
(多表)
create view getPro as
select p.*,t.tname from product as p inner join type as t on p.tid = t.id;
在这里插入图片描述

4.查看视图
Select * from getPro; 
在这里插入图片描述

5.修改视图
Alter view getPro as
select p.id,p.pName,t.tname from product as p inner join type as t on p.tid = t.id;
在这里插入图片描述

6.删除视图
drop view getPro;
在这里插入图片描述

四.如何通过视图修改基本表的数据

A:在视图上使用insert语句
  通过视图插入数据与直接在表中插入数据一样,但视图毕竟不是基本表.因此在进行数据插入时还是有一定的限制
  1:如果视图上没有包括基本表中属性为not null[不能为空]的列,那么插入操作会因为那些列是null值而失败.
  2:如果某些列因为某些规则或约束的限制而不能直接接受从视图插入的列时,插入会失败
  3:如果在视图中包含了使用聚合函数的结果,或是包含计算列,则插入操作会失败
  4:不能在使用了distinct语句的视图中插入值
  5:不能在使用了group by语句的视图中插入值

B:使用update更新视图中的数据
  1:更新视图与更新表格一样,但是在视图中使用了多个基本表连接的情况下,每次更新操作只能更新来自基本表的一个数据列
  
C:使用delete删除视图中数据.
  通过视图删除数据最终体现为从基本表中删除数据
  格式:delete 视图名 [where 条件]
  说明:当视图由两个以上的基表构成时,不允许删除视图的数据

案例2

创建student表并插入数据:

create table student(
id int PRIMARY key auto_increment,
name varchar(30) not null unique,
grade int,
class int not null
);

INSERT INTO student(NAME,grade,class) VALUES(‘张三’,80,1), (‘老蛇皮’,70,1), (‘李四’,90,2) ;
在这里插入图片描述
(1)基于student2表创建视图student_view:

CREATE VIEW student_view AS
SELECT * FROM student;
在这里插入图片描述
执行insert操作:

INSERT INTO student_view(NAME,grade,class) VALUES(‘老万’,86,2);
在这里插入图片描述
INSERT INTO student_view(NAME,grade,) VALUES(‘王五’,86);-------报错,失败

执行update操作:
UPDATE student_view SET NAME=‘李白’ WHERE NAME=‘老蛇皮’;
在这里插入图片描述
执行delete操作:
DELETE FROM student_view WHERE class=1;
在这里插入图片描述
查看student表,显示数据也被删除

(2)基于student2表 使用gruop by 创建视图student_view2:
create table student2(
id int PRIMARY key auto_increment,
name varchar(30) not null ,
grade int,
class int not null
);

INSERT INTO student2(NAME,grade,class) VALUES(‘张三’,80,1), (‘lsp’,70,1), (‘李四’,90,2) ;
创建视图:
create view student_view2 as
SELECT class,COUNT(class) FROM student2 GROUP BY class ;
在这里插入图片描述
自然是不能增删改了

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值