数据库的视图
一、什么是视图?
视图是从一个或几个基本表(或视图)中导出的虚拟的表。在系统的数据字典中仅存放了视图的定义,不存放视图对应的数据。
视图是原始数据库数据的一种变换,是查看表中数据的另外一种方式。可以将视图看成是一个移动的窗口,通过它可以看到感兴趣的数据。 视图是从一个或多个实际表中获得的,这些表的数据存放在数据库中。那些用于产生视图的表叫做该视图的基表。一个视图也可以从另一个视图中产生。
视图的定义存在数据库中,与此定义相关的数据并没有再存一份于数据库中。通过视图看到的数据存放在基表中。
视图看上去非常像数据库的物理表,对它的操作同任何其它的表一样。当通过视图修改数据时,实际上是在改变基表中的数据;相反地,基表数据的改变也会自动反映在由基表产生的视图中。
由于逻辑上的原因,有些视图可以修改对应的基表 (即 基本表),而有些则不能(仅仅能查询 如由多张表构建的视图)。
二、基本表和视图两者的区别
基本表:是数据库中永久存储的表,并且基表就是实际存在的表,它是实际存储数据的逻辑表示;
基本表的定义指建立基本关系模式,
而变更则是指对数据库中已存在的基本表进行删除与修改。
区别:
-
视图是已经编译好的sql语句。而表不是
-
视图没有实际的物理记录。而表有。
-
表是内容,视图是窗口
-
表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时对它进行修改,但视图只能有创建的语句来修改
-
表是内模式,试图是外模式
-
视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。
-
表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表。
-
视图的建立和删除只影响视图本身,不影响对应的基本表。
联系:视图(view)是在基本表之上建立的表,它的结构(即所定义的列)和内容(即所有数据行)都来自基本表,它依据基本表存在而存在。一个视图可以对应一个基本表,也可以对应多个基本表。
视图是基本表的抽象和在逻辑意义上建立的新关系。
三、为什么要用视图
1.视图与查询的区别
视图和查询都是用由sql语句组成,这是他们相同的地方,但是视图和查询有着本质区别:
它们的区别在于:
1:存储上的区别:视图存储为数据库设计的一部分,而查询则不是.
2:更新限制的要求不一样
要注意:因为视图来自于表,所以通过视图可以间接对表进行更新,我们也可以通过update语句对表进行更新,但是对视图和查询更新限制是不同的,以下我们会知道虽然通过视图可以间接更新表但是有很多限制.
3:排序结果:通过sql语句,可以对一个表进行排序,而视图则不行。
2.视图的优点
1:为用户集中数据,简化用户的数据查询和处理。有时用户所需要的数据分散在多个表中,定义视图可将它们集中在一起,从而方便用户的数据查询和处理
2:屏蔽数据库的复杂性。用户不必了解复杂的数据库中的表结构,并且数据库表的更改也不影响用户对数据库的使用
3:简化用户权限的管理。只需授予用户使用视图的权限,而不必指定用户只能使用表的特定列,也增加了安全性
4:便于数据共享。各用户不必都定义和存储自己所需的数据,可共享数据库的数据,这样同样的数据只需存储一次
5:可以重新组织数据以便输出到其他应用程序中
视图的创建和管理
创建
格式:create view 视图名 as sql语句;
删除
格式:drop view 视图名;
说明:与删除表不同的是,删除视图后只是删除了视图了定义,并没有删除表中的数据.
修改视图的定义
修改视图
格式:alter view 视图名 as sql语句;
实际案例
students 学生表
courses 课程表
scores 成绩表
创建视图 CREATE VIEW xxxx AS
CREATE VIEW pro2 AS
SELECT s.sno ,s.sname ,c.cname,sc.degree
FROM students s ,scores sc ,courses c
WHERE s.sno=sc.sno AND sc.cno=c.cno
如何通过视图修改基本表的数据
A:在视图上使用insert语句
通过视图插入数据与直接在表中插入数据一样,但视图毕竟不是基本表.因此在进行数据插入时还是有一定的限制
1:如果视图上没有包括基本表中属性为not null[不能为空]的列,那么插入操作会因为那些列是null值而失败.
2:如果某些列因为某些规则或约束的限制而不能直接接受从视图插入的列时,插入会失败
3:如果在视图中包含了使用聚合函数的结果,或是包含计算列,则插入操作会失败
4:不能在使用了distinct语句的视图中插入值
5:不能在使用了group by语句的视图中插入值
B:使用update更新视图中的数据
1:更新视图与更新表格一样,但是在视图中使用了多个基本表连接的情况下,每次更新操作只能更新来自基本表的一个数据列
C:使用delete删除视图中数据.
通过视图删除数据最终体现为从基本表中删除数据
格式:delete 视图名 [where 条件]
说明:当视图由两个以上的基表构成时,不允许删除视图的数据
视图本质
本质就是一个查询,提高性能,预编译。多表联查,构建非常大结果集(内存)。缺点是不能SQL优化
现慢慢 被缓存 redis取代
MySQL 触发器
一、触发器概念
触发器(trigger):监视某种情况,并触发某种操作,它是提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,例如当对一个表进行操作( insert,delete, update)时就会激活它执行。
触发器经常用于加强数据的完整性约束和业务规则等。
触发器无法迁移,分布式,逐渐被框架中拦截器或过滤器替代,
触发器创建语法四要素:
1.监视地点(table)
2.监视事件(insert/update/delete)
3.触发时间(after/before)
4.触发事件(insert/update/delete)
触发器语法
- create trigger triggerName
- after/before insert/update/delete on 表名
- for each row #这句话在mysql是固定的
- begin
- sql语句;
- end;
DELIMITER $$
CREATE
/*[DEFINER = { user | CURRENT_USER }]*/
TRIGGER `库名`.`触发器名` BEFORE/AFTER INSERT/UPDATE/DELETE
ON `库名`.`<Table Name>`
FOR EACH ROW BEGIN
编写sql语句
END$$
DELIMITER ;
实际案例
学生表 student ,学号(stuid)为主键。
成绩表 cj ,number表示序号为主键,自动递增序列
需求: 设计一个触发器,当增加新的学生时,需要在成绩表中插入对应的学生信息,至于具体课程分数,后面由老师打分更新即可。
步骤:
1.首先它是一个插入Insert触发器,是建立在表student上的;
2.然后是after,插入后的事件;
3.事件内容是插入成绩表,主需要插入学生的学号和姓名,number为自增,而成绩 目前不需要。
注意:new表示student中新插入的值。
DELIMITER $$
CREATE
/*[DEFINER = { user | CURRENT_USER }]*/
TRIGGER `test2009`.`insert_stu` AFTER INSERT
ON `test2009`.`student`
FOR EACH ROW BEGIN
INSERT INTO cj (stu_id,stu_name)VALUES(new.stuid,new.username);
END$$
DELIMITER ;