MySQL数据库高级(三)——视图

MySQL数据库高级(三)——视图

1、视图简介

一、视图简介

视图是由SELECT查询语句所定义的一个虚拟表,是查看数据的一种很是有效的方式。视图包含一系列带有名称的数据列和数据行,但视图中的数据并不真实存在于数据库中,视图返回的是结果集。java

二、建立视图的目的

视图是存储在数据库中的查询的SQL语句,建立视图主要出于两种缘由:
A、实现安全。视图可设置用户对视图的访问权限。
建立查询是JAVA班学生成绩的视图javaview、NET班学生成绩的视图netview,受权java可以访问javaview视图,受权net能够访问netview视图。数据库

create view javaview
as
select a.StudentID,a.sname,email,c.subJectName,a.class,b.mark
 from TStudent a join TScore b on a.StudentID=b.StudentID
join TSubject c on b.subJectID=c.subJectID where a.class='JAVA';

create view netview
as
select a.StudentID,a.sname,email,c.subJectName,a.class,b.mark 
 from TStudent a join TScore b on a.StudentID=b.StudentID
join TSubject c on b.subJectID=c.subJectID where a.class='NET';

受权java用户访问 schoolDB.javaview视图
grant select on schoolDB.javaview to 'java'@'%' identified by '123456';
受权net用户访问 schoolDB.netview视图
grant select on schoolDB.netview to 'net'@'%' identified by '123456';
使用SQL Manager客户端链接数据库时,java、net用户分别能够访问javaview视图和netview视图。
B、隐藏数据复杂性。视图能够隐藏一些数据,如:社会保险基金表,能够用视图只显示姓名,地址,而不显示社会保险号和工资数等。视图就像一个视口,从视口中只能看到过滤后的某些数据列。安全

三、视图的优势

A、视图能简化用户操做
视图机制使用户能够将注意力集中在所关心地数据上。若是数据不是直接来自基本表,则能够经过定义视图,使数据库看起来结构简单、清晰,而且能够简化用户的的数据查询操做。例如,定义了若干张表链接的视图,就将表与表之间的链接操做对用户隐藏。用户所做的只是对一个虚表的简单查询,而虚表是怎样得来的,用户无需了解。
B、视图使用户能以多种角度看待同一数据
视图机制能使不一样的用户以不一样的方式看待同一数据,当许多不一样种类的用户共享同一个数据库时。
C、视图对重构数据库提供了必定程度的逻辑独立性
数据的物理独立性是指用户的应用程序不依赖于数据库的物理结构。数据的逻辑独立性是指当数据库重构造时,如增长新的关系或对原有的关系增长新的字段,用户的应用程序不会受影响。层次数据库和网状数据库通常能较好地支持数据的物理独立性,而对于逻辑独立性则不能彻底的支持。
在关系数据库中,数据库的重构造每每是不可避免的。重构数据库最多见的是将一个基本表“垂直”地分红多个基本表。例如:将学生关系student(sid,sname,sex,age,dept,leader),分为studentinfo(sid,sname,sex,age)和deptinfo(sid,dept)两个关系。原表student为studentinfo表和deptinfo表天然链接的结果。若是创建一个视图student:网络

CREATE VIEW student(sid,sname,sex,age,dept) 
AS SELECT studentinfo.sid,studentinfo.sname,studentinfo.sex,studentinfo.age,
deptinfo.dept FROM studentinfo, deptinfo WHERE studentinfo.sid=deptinfo.sid;

尽管数据库的逻辑结构变为studentinfo和deptinfo 两个表,但应用程序没必要修改,由于新创建的视图定义为用户原来的关系,使用户的外模式保持不变,用户的应用程序经过视图仍然可以查找数据。
视图只能在必定程度上提供数据的逻辑独立,好比因为视图的更新是有条件的,所以应用程序中修改数据的语句可能仍会由于基本表构造的改变而改变。
D、视图可以对机密数据提供安全保护
在设计数据库应用系统时,能够对不一样的用户定义不一样的视图,使机密数据不出如今不该该看到机密数据的用户视图上。如student表涉及全校15个院系学生数据,能够在其上定义15个视图,每一个视图只包含一个院系的学生数据,并只容许每一个院系的主任查询和修改本原系学生视图。
E、适当的利用视图能够更清晰地表达查询
例如常常须要执行这样的查询“对每一个学生找出他得到最高成绩的课程号”。能够先定义一个视图,求出每一个同窗得到的最高成绩。数据结构

四、建立视图的语法

CREATE VIEW viewname(列1,列2...)
 AS SELECT (列1,列2...)
 FROM ...;

建立学生信息的视图:ide

create view studentview
as select studentID, sname, sex from TStudent;

2、视图的操做

一、视图的使用

视图的使用和普通表同样。
select * from studentview;
不能在一张由多张关联表链接而成的视图上作同时修改两张表的操做;
视图与表是一对一关系状况:若是没有其它约束(如视图中没有的字段,在基本表中是必填字段状况),能够进行增删改数据操做。.net

二、删除视图

drop view studentview;计算机网络

三、经过视图修改数据

若是视图的基表是一张表,能够经过视图向基表插入记录,要求视图中的没有的列容许为空。
A、经过视图插入数据到表
insert into studentview(studentID, sname, sex)VALUES('01001', '孙悟空', '男');
查询插入的记录,能够看到经过视图没有的列,值为空或默认值。
MySQL数据库高级(三)——视图
B、经过视图删除表中记录
视图的基表只能有一张表,若是有多张表,将不知道从哪一张表删除。
delete from studentview where studentid='01001';
C、经过视图修改表中记录
只能修改视图中有的列。
update studentview set sname='孙悟空' where studentid='00001';设计

四、查看视图的信息

查看视图的信息code

describe viewname;
desc scoreview;

查看全部的表和视图
show tables;
查看视图的信息
show fields from scoreview;

五、修改视图

CREATE OR REPLACE VIEW viewname AS SELECT [...] FROM [...];

alter view studentview 
as select studentID as 学号, sname as 姓名, sex as 性别 from TStudent;

六、WITH CHECK OPTION

若是在建立视图的时候指定了“WITH CHECK OPTION”,更新数据时不能插入或更新不符合视图限制条件的记录。

3、视图实例

一、使用视图建立视图

建立视图的查询的表称为基表,基表能够是视图和表。

create view sview
as select studentID, sname, sex from studentview where studentID>990 and sex='男';

二、建立学生成绩表的视图

建立一个视图,视图包含学生 学号、姓名、学科和成绩。

create view view1
as select a.StudentID,a.Sname,c.subJectName,b.mark  from TStudent a 
join TScore b on a.StudentID=b.StudentID join TSubject c on b.subJectID=c.subJectID;

MySQL数据库高级(三)——视图
建立成绩视图,包含学号、姓名、计算机网络课程成绩、数据结构成绩、JAVA开发成绩。

create view scoreview
as select studentid 学号,sname 姓名,
AVG(case subjectname when '计算机网络' then mark END) 计算机网络,
AVG(case subjectname when '数据结构' then mark END) 数据结构,
AVG(case subjectname when 'JAVA开发' then mark END)  JAVA开发 from view1
group by 学号;

MySQL数据库高级(三)——视图

相关文章
相关标签/搜索