【数据库基础】对SQL语言中视图的理解
来源:互联网 发布:mac怎么创建快捷方式 编辑:程序博客网 时间:2024/06/12 02:17
为什么需要视图
- 重用SQL语句。
- 简化复杂的SQL操作。
- 保护数据。可以给用户授予表的特定部分的访问权限而不是整个
表的访问权限。 - 更改数据格式和表示。视图可返回与底层表的表示和格式不同的
数据
举个例子:
比如我们需要经常检索某一个同学选修课程的成绩。
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,将某一特定功能封装起来,我们使用时只要了解其功能,而不需要了解他内部的实现过程。
怎么使用视图
- 创建视图:
基本语法: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#);
- 使用视图
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="张三";
- 更新视图
视图不保存数据,只是一个虚表,对视图的更新最终还是要反映到基本表中。
所以对一个视图的更新,又重重的约束。
基本上可以说,如果MySQL不能正确地确定被更新的基本表数据,则不允许更新(包括插入和删除)。这实际上意味着,如果视图定义中有以下操作,则不能进行视图的更新:
分组(使用GROUP BY和HAVING)、联结、 子查询、 并、 聚集函数(Min()、Count()、 Sum()、DISTINCT、导出(计算)列……
换句话说,本章许多例子中的视图都是不可更新的。这听上去好像
是一个严重的限制,但实际上不是,因为视图主要用于数据检索
那么,什么视图可以更新呢?
视图是单一基本表的映射,且视图包含基本表的主键,则可以更新。
撤销视图
基本语法:
drop view view_name;
eg:撤销视图compStud
drop view compStud
视图使用的注意点(取自MYSQL必知必会)
- 与表一样,视图必须唯一命名(不能给视图取与别的视图或表相
同的名字) - 对于可以创建的视图数目没有限制。
- 为了创建视图,必须具有足够的访问权限。这些限制通常由数据
库管理人员授予。 - 视图可以嵌套,即可以利用从其他视图中检索数据的查询来构造
一个视图。 - ORDER BY可以用在视图中,但如果从该视图检索数据SELECT中也
含有ORDER BY,那么该视图中的ORDER BY将被覆盖。 - 视图不能索引,也不能有关联的触发器或默认值。
- 视图可以和表一起使用。例如,编写一条联结表和视图的SELECT
语句。 - 因为视图不包含数据,所以每次使用视图时,都必须处理查询执行
时所需的任一个检索。如果你用多个联结
和过滤创建了复杂的视图或者嵌套了视图,可能会发现性能
下降得很厉害。因此,在部署使用了大量视图的应用前,应
该进行测试。
- 【数据库基础】对SQL语言中视图的理解
- 对数据库视图view的理解
- SQL语言基础-视图
- sql语言中对数据库的表的判断
- 数据库视图的理解
- SQL数据库语言基础
- C语言中对const的理解
- C语言中对数据类型的理解
- 数据库中Sql语句,存储过程,触发器对性能影响的理解
- SQl分区表,视图,索引,函数基础理解
- PowerDesigner导出SQL中对视图的处理
- Unity中对SQL数据库的操作
- 数据库SQL语言语法总结5---视图
- 对数据库的理解
- [SQL] 如何获取数据库视图中所有列的名称
- sql 获取数据库中所有表和视图的列
- 数据库中序列、视图、游标、包、动态SQL的使用
- JavaWeb整理-数据库基础/数据库介绍.MySQL安装.DB DBS DBMS关系.登陆MySQL.SQL语言认识..SQL语言对数据库操作.SQL语言对数据表操作.SQL语言对数据表中的记录操作
- Python sklearn数据分析中常用方法
- 字符串相等的比较方法,字符串的基本数据类型和引用数据类型。
- MP3相关
- 后台转义操作
- Servlet中请求与响应的编码总结
- 【数据库基础】对SQL语言中视图的理解
- J
- 根据省市县获取code和邮编工具类
- Redis 事务和watch应用于秒杀商品应用
- oracle的执行计划中表的链接方式介绍
- Android 用户界面---样式和主题(Styles and Themes)(二)
- Python 判断回数(例如12321、909)
- 分表+分区
- Ueditor上传图片时打开文件夹的延迟问题以及config.json中路径配置问题