1、视图的概念

视图是从一个或几个基本表(或视图)中导出的表。他与基本表不同,但在操作上又与基本表相似。数据库只存放视图的定义(存放在数据字典中),而不存放视图对应的数据。所以一旦基本表中的数据发生变化,从视图中查询出的数据也就随之改变了。从这个意义上讲,视图就像一个窗口,透过它可以看到数据库中自己感兴趣的数据及其变化。
视图一经定义,就可以和基本表一一样被查询、 被删除。也可以在一个视图之上再定义新的视图,这种类型的视图,会对视图的更新(增、删、改)操作则有一定的限制。

2、视图的操作

2.1、建立视图

SQL语言用CREATE VIEW命令建立视图,其一般格式为:

CREATE VIEW 视图名 [列名1,列名2...]

AS 子查询

[WITH CHECK OPTION];

其中,子查询可以是任意的SELECT语句,是否可以含有ORDER BY子句和DISTINCT短语,则取决于具体系统的实现(mysql中可以含有ORDER BY子句和DISTINCT短语,不知其他数据库能否含有)。

WITH CHECK OPTION表示对视图进行UPDATE、INSERT和DELETE操作时要保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)如果满足则操作成功,反之操作失败。

组成视图的属性列名或者全部省略或者全部指定,没有第三种选择。如果省略了视图

的各个属性列名,则隐含该视图由子查询中SELECT子句目标列中的诸字段组成。但在下

列三种情况下必须明确指定组成视图的所有列名:

  1. 某个目标列不是单纯的属性名,而是聚集函数或列表达式;
  2. 多表连接时选出了几个同名列作为视图的字段:
  3. 需要在视图中为某个列启用新的更合适的名字。

例如在mystudent数据库中,有一基本表student,主码是Sno表示学生学号,还有Sname(学生姓名)、Ssex(学生性别)、Sage(学生年龄)、Sdept(学生所在系)多个字段。

示例1:建立信息系学生的视图。

CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept='IS';  /*IS是指信息系*/

该示例中省略了视图IS_Student的列名,则表明IS_Student的列名是由select子句中的三个列名组成。

数据库只存放视图的定义(存放在数据字典中),并不执行其中的select查询子句。只是在对视图查询时,才按视图的定义从基本表中将数据查出。

示例2:建立信息系学生的视图,并要求进行修改和插入操作时仍需保证该视图只有信息系的学生。

CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept='IS'
WITH CHECK OPTION;  #with check option会判断对该视图进行增删改时是否满足where子语句

由于在定义IS_Student视图时加上了WITH CHECK OPTION子句,以后对该视图进行插入、修改和删除操作时,关系数据库管理系统会自动判断新的数据是否满足Sdept='IS'的条件,若满足则操作成功,反之操作失败。

下面介绍一种特殊且重要的视图类型——行列子集视图

行列子集视图:若一个视图是从单个基本表导出的,并且只是去掉了基本表的某些行和某些列,但保留了主码,则称这类视图为行列子集视图。

示例1、2中的IS_Student视图就是一个行列子集视图。

示例3:

create view view1(学号,姓名,学科,分数
as
select student.Sno,Sname,sc.Sname,sc.grade
from student,sc
where student.sno=sc.sno;

上面的view1不是行列子集视图,因为该视图不是从一个基本表中导出的。这是一个细节,很多新手都会忽略这一点。同时注意行列子集视图要求必须包含主码。

只有行列子集视图才能进行删除、增加、修改,其他类型的不可以。

视图不仅可以建立在单个基本表上,也可以建立在多个基本表上。

示例4:

在mystudent数据库中,还有学生选课SC基本表,该表中有学生学号、课程号、分数三个字段,其中学生学号和课程号共同组成SC表的主码。

这时我们想建立一个信息系选修了1号课程的学生的视图,显然该视图建立在多个基本表上。

create view IS_C1(Sno,Sname,Grade)
as
select Student.Sno,Sname,Grade
from Student,SC
where Sdept='IS' and Student.Sno=SC.Sno and SC.Cno='1';

由于视图IS_C1的属性列中包含了Student表与SC表的同名列Sno,所以必须在视图名后面明确说明视图的各个属性列名。

视图不仅可以建立在一个或多个基本表上,也可以建立在一个或多个已定义好的视图上,或建立在基本表与视图上(可以混合)。

示例5,建立信息系选修了1号课程且成绩在90分以上的学生的视图:

针对这道题,我们可以使用在Student和SC基本表上建立视图,但是我要求不能用这种方式。怎么办呢?我们是否能在刚才的视图上再新建一个视图,答案是肯定可以的。

create view IS_C1_GradeMore90
as
select Sno,Sname,Grade
from IS_C1
where Grade>90;

显然IS_C1_GradeMore90视图是建立在IS_C1视图上的。

定义基本表时,为了减少数据库中的冗余数据,表中只存放基本数据,由基本数据经过各种计算派生出的数据一般是不存储的。由于视图中的数据并不实际存储,所以定义视图时可以根据应用的需要设置一些派生属性列。这些派生属性由于在基本表中并不实际存在,也称它们为虚拟列。带虚拟列的视图也称为带表达式的视图。

示例6,建立一个反应学生出生年份的视图:

create view Birth_S(Sno,Sname,Sbirth)
as
select Sno,Sname,YEAR(NOW())-Sage
from Student;

这里视图Birth_S是一个带表达式的视图,视图中的出生年份值是通过计算得到的。还可以看到子查询语句中使用了列表达式,因此Birth_S视图中就要指明属性列。

还可以用带有聚集函数和group by 子句的查询来定义视图,这种视图称为分组视图

示例7,将学生的学号及平均成绩定义为一个视图:

create view S_Grade(Sno,Gavg)
as
select Sno,AVG(Grade)
from SC
group by Sno;

由于select子句中使用了聚集函数,所以在定义视图时要明确指出组成S_Grade视图的各个属性列名。

2.2、查看视图基本信息

我们可以像查看基本表一样,来查看视图的基本信息。主要有两个语句:

show create view 视图名\Gdesc 视图名;

这两种方式查看到的信息有所不同,可以结合使用。

2.3、查询视图

注意这里是查询视图中的数据信息,不是上面的视图基本信息。视图定义后,用户就可以像对基本表一样对视图进行查询了,它们二者的查询方式基本一致。

在这里要说明2点

第1点:有关查询视图系统内部发生的动作。关系数据库管理系统执行对视图的查询时,首先进行有效性检查,检在查询中涉及的表、视图等是否存在。如果存在,则从数据字典中取出视图的定义,把定义中的子查询和用户的查询结合起来,转换成等价的对基本表的查询,然后再执行修正了的查询。这一转换过程称为视图消解

第2点:在视图上查询和基于派生表的查询的区别。视图一旦定义,其定义将永久保存在数据字典中,之后的所有查询都可以直接引用该视图。而派生表只是在语句执行时临时定义,语句执行后该定义即被删除。

具体查询视图操作和查询基本表操作一样,这里不再举例。

2.4、删除视图

drop view 视图名 [cascade];

使用cascade时,为级联删除,也就是与该视图相关连的数据对象都会被删除。

3、视图的作用

视图最终是定义在基本表之上的,对视图的一切操作最终也要转换为对基本表的操作。而且对于非行列子集视图进行查询或更新时还有可能出现问题。既然如此,为什么还要定义视图呢?这是因为合理使用视图能够带来许多好处。

  1. 视图能够简化用户的操作
  2. 视图使用户能以多种角度看待同一数据
  3. 视图对重构数据库提供了一定程度的逻辑独立性
  4. 视图能够对机密数据提供安全保护
  5. 适当定义视图可以更清晰地表达查询

对第3点说明一下:

数据的逻辑独立性是指当数据库重构造时,如增加新的关系或对原有关系增加新的字段等,用户的应用程序不会受影响。

层次数据库和网状数据库一般能较好地支持数据的物理独立性,而对于逻辑独立性则不能完全地支持。在关系数据库中,数据库的重构往往是不可避免的。重构数据库最常见的是将一个基本表“垂直”地分成多个基本表。例如:将学生关系Student(Sno,Sname,Ssex,Sage,Sdept)分为SX(Sno,Sname,Sage)和SY(Sno,Ssex,Sdept)两个关系。这时原表Student为SX表和SY表自然连接的结果。如果建立一个视图Student:

CREATE VIEW Student(Sno,Sname,Ssex,Sage,Sdept)
AS
SELECT SX.Sno,SX.Sname,SY.Ssex,SX.Sage,SY.Sdept
FROM SX,SY
WHERE SX.Sno=SY.Sno:

这样尽管数据库的逻辑结构改变了(变为SX和Y两个表),但应用程序不必修改,因为新建立的视图定义为用户原来的关系,使用户的外模式保持不变,用户的应用程序通过视图仍然能够查找数据。

当然,视图只能在一定程度上提供数据的逻辑独立性,比如由于对视图的更新是有条件的,因此应用程序中修改数据的语句可能仍会因基本表结构的改变而需要做相应修改。

mysql中有关视图的概念、操作及作用相关推荐

  1. Mysql中的视图是什么?有什么作用?

    Mysql中的视图,其实是一个虚拟表,使用时动态检索查询数据,如何理解这个概念呢?我们先建立基础表,语句如下: DROP TABLE IF EXISTS `user_info`; CREATE TAB ...

  2. mysql中的视图_分布式 | DBLE 是如何实现视图的?

    作者:苏仕祥 浩鲸科技 PaaS 组件团队成员,长期从事分库分表中间件的相关解决方案工作,热爱技术,乐于分享. 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并 ...

  3. 在MySQL中创建视图的X种方式

    在本教程中,您将学习如何使用CREATE VIEW语句在MySQL中创建视图. CREATE VIEW语句简介 要在MySQL中创建新视图,请使用CREATE VIEW语句. 在MySQL中创建视图的 ...

  4. MySQL中的视图操作

    文章目录 1 为什么要使用视图 2 创建视图 3 查看视图 4 更新视图数据 5 修改视图 6 删除视图 1 为什么要使用视图 小学的时候,每年都会举办一次抽考活动,意思是从每一个班级里面筛选出几个优 ...

  5. 详细介绍mysql中的视图

    视图 1.常见的数据库对象 2.视图 2.1为什么使用视图 视图一方面可以帮我们使用表的一部分而不是所有的表,另一方面也可以针对不同的用户制定不同的查询视图.比如,针对一个公司的销售人员,我们只想给他 ...

  6. mysql中创建视图、索引

    数据库的三级模式两级映射: 存储文件------>基本表----->视图 内模式   ------->模式   ------>外模式 一.视图 1.什么是视图: 视图是从一个或 ...

  7. mysql创建视图sql_SQL视图介绍-如何在SQL和MySQL中创建视图

    mysql创建视图sql 什么是SQL视图? (What is a View in SQL?) A View is a database object that presents data exist ...

  8. mysql中创建视图语法错误_mysql - 使用过程MySQL创建视图时出错 - 堆栈内存溢出

    尝试使用过程创建视图时出现问题. 我必须这样做,因为我需要在MySQL中发挥作用,将表的行转换为另一个表的列. 该查询效果很好,但是当我将其放在" CREATE VIEW"语句中时 ...

  9. Revit建模中 构件视图隐藏怎么操作?

    作为BIM结果的最后一种表现,出图对于长期使用Revit的BIMer来说是一大伤脑筋,无论是其"不满意"的标注能力,或者是其极其"反人类"的图层设置,大大增加了 ...

  10. 如何在MySQL中创建视图

    CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS ...

最新文章

  1. 华为手机如何升级鸿蒙系统_华为杨海松:明年所有华为自研设备升级鸿蒙系统...
  2. linux命令匹配path顺序,PATH 中的路径先后顺序的问题
  3. 14种常见HTTP状态码
  4. Spark技术内幕: Task向Executor提交的源代码解析
  5. 竞赛奇葩队名,学编程的人都是隐藏的段子手 | 今日最佳
  6. C# 代码重启windows服务
  7. 滴滴披露女司机数据:80后女性过半 24%全年零违章
  8. SQL Server2008 错误源:.net SqlClient data provider的解决方法
  9. 百度文库如何免费下载
  10. 计算机图形学实验一直线-DDA算法
  11. 30个python常用代码大全_30 个 Python 常用极简代码,拿走就用
  12. 03单点登录CAS5.3.4集成客户端
  13. diskgenius创建efi分区_怎么创建efi系统分区?efi系统分区创建教程
  14. matlab取特征值,matlab提取图像特征值
  15. 多渠道打包,生成不同包名的包
  16. HTML、css基础知识
  17. AD学习记录03-规则
  18. 视频教程-大数据搜索技术-大数据
  19. 递归方式实现打印一个整数的每一位
  20. 超级无敌各种排序算法 一个代码解决<可以做后序模板>

热门文章

  1. 织梦木马 data.php,DedeCMS后门木马专杀工具V2.0
  2. java 如何打印自己快捷键_怎么快捷键取消正在执行的打印操作?
  3. 图片裁切批处理_图片批量处理 如何批量将图片裁剪成一样的大小?按照一定的比例快速裁剪多张照片...
  4. bigWigToBedGraph格式转换
  5. 系统架构设计师 - ESB 企业服务总线
  6. tiny210 ubuntu下sd卡分区
  7. ArcGIS无插件加载(无偏移)天地图
  8. 技术笔记:.Net全套就业班视频教程——数据库
  9. 在python中查询excel内容
  10. CentOS设置SSH Key登录