【数据库基础】对SQL语言中视图的理解

来源:互联网 发布:mac怎么创建快捷方式 编辑:程序博客网 时间:2024/06/12 02:17

为什么需要视图

  1. 重用SQL语句。
  2. 简化复杂的SQL操作。
  3. 保护数据。可以给用户授予表的特定部分的访问权限而不是整个
    表的访问权限。
  4. 更改数据格式和表示。视图可返回与底层表的表示和格式不同的
    数据

举个例子:
比如我们需要经常检索某一个同学选修课程的成绩。

select S#,Sname,scorefrom student S,Scwhere S.S#=Sc.Sc and Sname="张三";

每检索一个特定的学生,我们就要一条这样的语句。很烦,而且对我们写出正确的Sql查询语句的人来讲,要了解这个database中tables之间的关系。比如我们不知道student和Sc两个表之间可以用student中的外键S#和Sc中的主键联系起来,那么就写不出来这样的语句。

所以为了克服上述的弊端。SQL引入了视图:
对上述优化如下:

create view StuScoreas(select S#,Sname,scorefrom student S,Scwhere S.S#=Sc.Sc);

然后我们要查询特定同学的成绩,即可写出这样的语句;

select S# Sname scorefrom StuScorewhere Sname="某某";

在视图创建之后,可以用与表基本相同的方式利用它们。可以对视
图执行SELECT操作,过滤和排序数据,将视图联结到其他视图或表,甚
至能添加和更新数据(添加和更新数据存在某些限制)。

这样对于需要查询信息的人来讲,就完全不需要了解database中tables之间的关系。就可以完成查询,得到正确结果。

个人感觉,视图有点像高级语言中的API,将某一特定功能封装起来,我们使用时只要了解其功能,而不需要了解他内部的实现过程。

怎么使用视图

  1. 创建视图:
    基本语法:create view view_name [,[列名]……] as 子查询
    eg:定义一个视图compStud为计算机系的同学,而屏蔽掉其他系的同学信息
create view compStudas (select * from student where D# in (select D# from Dept where Dname="计算机"));

eg:定义一个视图teacher ,屏蔽掉关于老师工资隐私信息,只反映每一位老师教哪门课,有多少学分。

create view teacheras (select Tname,Cname,Credit from Teacher T,Course C where T.T#=C.C#);
  1. 使用视图
    eg:查询计算机系同学的平均年龄。利用上面的视图compStud。
select avg(Sage)from compStud;

eg:
先创建一个视图,描述每一位同学的平均成绩,最高成绩,最低成绩,学了多少门课。如下:

create view StudStat (S#,Sname,avgS,Maxs,Mins,countS)as(select S#,Sname,avg(score),max(score),min(score),count(*)from student,Sc where student.S#=Sc.S# group by student.S#);

然后利用创建的StudStat查询某位同学的平均成绩,最高成绩,最低成绩,学了多少门课:

select * from StudStat where Sname="张三";
  1. 更新视图
    视图不保存数据,只是一个虚表,对视图的更新最终还是要反映到基本表中。
    所以对一个视图的更新,又重重的约束。
    基本上可以说,如果MySQL不能正确地确定被更新的基本表数据,则不允许更新(包括插入和删除)。这实际上意味着,如果视图定义中有以下操作,则不能进行视图的更新:
    分组(使用GROUP BY和HAVING)、联结、 子查询、 并、 聚集函数(Min()、Count()、 Sum()、DISTINCT、导出(计算)列……

换句话说,本章许多例子中的视图都是不可更新的。这听上去好像
是一个严重的限制,但实际上不是,因为视图主要用于数据检索

那么,什么视图可以更新呢?
视图是单一基本表的映射,且视图包含基本表的主键,则可以更新。

撤销视图

基本语法:

drop view view_name;

eg:撤销视图compStud

drop view compStud

视图使用的注意点(取自MYSQL必知必会)

  1. 与表一样,视图必须唯一命名(不能给视图取与别的视图或表相
    同的名字)
  2. 对于可以创建的视图数目没有限制。
  3. 为了创建视图,必须具有足够的访问权限。这些限制通常由数据
    库管理人员授予。
  4. 视图可以嵌套,即可以利用从其他视图中检索数据的查询来构造
    一个视图。
  5. ORDER BY可以用在视图中,但如果从该视图检索数据SELECT中也
    含有ORDER BY,那么该视图中的ORDER BY将被覆盖。
  6. 视图不能索引,也不能有关联的触发器或默认值。
  7. 视图可以和表一起使用。例如,编写一条联结表和视图的SELECT
    语句。
  8. 因为视图不包含数据,所以每次使用视图时,都必须处理查询执行
    时所需的任一个检索。如果你用多个联结
    和过滤创建了复杂的视图或者嵌套了视图,可能会发现性能
    下降得很厉害。因此,在部署使用了大量视图的应用前,应
    该进行测试。
阅读全文
0 0
原创粉丝点击