mysql中视图的概念_MySql中的视图的概念及应用

视图的基本概念

视图是从一个或几个基本表(或者视图)导出的表。它与基本表不同,是一个虚表。

数据库只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。所以基本表中的数据发生变化,从视图中查询出的数据也就随之改变了。

视图一经定义,就可以和基本表一样被查询、被删除。也可以在一个视图之上再定义新的视图,但对视图的更新(增、删、改)操作则有一定的限制。

视图的优点

视图相比基本表有以下优点:

1.视图能够简化用户的操作

视图机制用户可以将注意力集中在所关心的数据上。如果这些数据不是直接来自基本表,则可以通过定义视图,使数据库看起来结构简单、清晰,并且可以简化用户的数据查询操作。

2.视图是用户能以不同的角度看待同样的数据。

对于固定的一些基本表,我们可以给不同的用户建立不同的视图,这样不同的用户就可以看到自己需要的信息了。

3.视图对重构数据库提供了一定程度的逻辑性。

比如原来的A表被分割成了B表和C表,我们仍然可以在B表和C表的基础上构建一个视图A,而使用该数据表的程序可以不变。

4.视图能够对机密数据提供安全保护

比如说,每们课的成绩都构成了一个基本表,但是对于每个同学只可以查看自己这门课的成绩,因此可以为每个同学建立一个视图,隐藏其他同学的数据,只显示该同学自己的数据。

5.适当的利用视图可以更加清晰的表达查询

有时用现有的视图进行查询可以极大的减小查询语句的复杂程度。

说明:本文章中的用来作为示例的数据表有三个:student、course、sc 数据表具体请看:Mysql数据库中的EXISTS和NOT EXISTS

建立视图

SQL视图建立命令

CREATE VIEW [([,]…)]

AS

[WITH  CHECK  OPTION];

其中,子查询可以是任意复杂的SELECT语句,但通常不允许包含ORDER BY子句和DISTINCT短语(因为子查询是中间结果)。

组成视图的属性列名可以

全部省略或全部指定,如果省略,则隐含由子查询中SELECT目标列中的诸字段组成;

但在下列情况下必须明确指定视图的所有列名:

(1)某个目标列不是单纯的属性名,而是聚集函数或列表达式,或者目标列为*

(2)多表连接时选出了几个同名列作为视图的字段

(3)需要在视图中为某个列启用新的更合适的名字

RDBMS执行CREATE VIEW语句时只是把视图的定义存入数据字典,并不执行其中的SELECT语句。在对视图查询时,按视图的定义从基本表中将数据查出。

建立的视图可以简单的分为以下三类:

行列子集视图

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

例子1.1

建立信息系学生的视图

SQL语句:

CREATE VIEW IS_Student

AS SELECT Sno, Sname, Sage FROM Student WHERE Sdept= 'IS' 本例中省略了视图IS_Student的列名,隐含了由子查询中SELECT子句中的三个列名组成。

2299cbe6aaf1028a25c4dc458a9441b1.png

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

例子1.2

建立信息系学生的视图,并要求透过该视图进行的更新操作只涉及信息系学生

SQL语句:

CREATE VIEW IS_Student

AS SELECT Sno, Sname, Sage

FROM Student

WHERE Sdept= 'IS'

WITH CHECK OPTION;

由于在定义IS_Student视图时加上了WITH CHECK OPTION子句,以后对该视图进行插入、修改和删除操作时,RDBMS会自动加上Sdept='IS'的条件:

插入操作:DBMS自动检查Sdept属性值是否为'IS'

如果不是,则拒绝该插入操作

如果没有提供Sdept属性值,则自动定义Sdept为'IS'

修改操作:DBMS自动加上Sdept= 'IS'的条件

删除操作:DBMS自动加上Sdept= 'IS'的条件

视图不仅可以建立在单个基本表上,也可以建立在多个基本表上,或者建立在基本表和视图的基础上。

例子1.3 建立信息系选修了1号课程的学生视图

CREATE VIEW IS_S1(Sno, Sname, Grade)

AS SELECT Student.Sno, Sname, Grade

FROM Student, SC

WHERE Sdept= 'IS' AND

Student.Sno=SC.Sno AND

SC.Cno= '1';

a6f272466752c087e943fba257aadcf8.png

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

CREATE VIEW IS_S2

AS SELECT Sno, Sname, Grade

FROM IS_S1

WHERE Grade>=90;

a6f272466752c087e943fba257aadcf8.png

带表达式的视图

定义基本表时,为了减少数据库中的冗余数据,表中只存放基本数据,由基本数据经过各种计算派生出的数据一般是不存储的。

但由于视图中的数据并不实际存储,所以定义视图时可以根据应用的需要,设置一些派生属性列。

这些派生属性列由于在基本标中并不实际存在也称他们为

虚拟列,带虚拟列的视图也称为

带表达式的视图

例子2.1 定义一个反映学生出生年份的视图

CREATE VIEW BT_S(Sno, Sname, Sbirth)

AS SELECT Sno, Sname, 2000-Sage

FROM Student;

441f8ce0b8baedf21257d3a7e4540735.png

分组视图

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

例子3.1将学生的学号及他的平均成绩定义为一个视图

CREATE VIEW S_G(Sno, Gavg)

AS SELECT Sno, AVG(Grade) FROM SC GROUP BY Sno;

5176d9b049a3489dcd3d5037fceb83fa.png

由于AS子语句中SELECT语句语句的目标列平均成绩是通过作用聚集函数得到的,所以CREATE VIEW中必须明确定义组成S_G视图的每个属性列名,S_G是一个分组视图。

例子3.2将Student表中所有女生记录定义为一个视图

CREATE VIEW F_Student1(stdnum, name, sex, age, dept)

AS SELECT * FROM Student WHERE Ssex='女';

305740e792bf162fb4b901db3ab91467.png

这里的视图F_Student1是由子查询“SELECT *”建立的,需要明确定义组成F_Student1视图的每个属性列名。

查询视图

视图定义以后,用户就可以像查询基本表一样查询视图了。

因此从用户角度看,查询视图与查询基本表相同。

不过,所有对视图的查询,都会被数据库管理软件解释成对基本数据表的查询,因为视图是在基本表的基础上抽象出来的。

例子4.1在信息系学生的视图中找出年龄小于20岁的学生

SELECT Sno, Sage

FROM IS_Student

WHERE Sage<20;

IS_Student视图的定义(视图定义例1):

CREATE VIEW IS_Student

AS SELECT Sno, Sname, Sage

FROM Student

WHERE Sdept= 'IS';

DBMS转换后的查询语句为:

SELECT Sno, Sage

FROM Student

WHERE Sdept='IS' AND Sage<20;

更新视图

更新视图是指通过视图插入、删除和修改数据。

由于视图是不实际存储数据的虚表,因此对视图的更新最终要转换为对基本表的更新。

从用户角度看,更新视图与更新基本表相同;RDBMS将之转化为对基本表的更新操作。

为防止用户通过视图对数据进行更新时,有意无意地对不属于视图范围内的基本表数据进行操作,可以在定义视图时加上WITH CHECK OPTION子句。

这样在视图上增删改数据时,RDBMS会检查视图定义中的条件,若不满足条件,则拒绝执行该操作。

例子5.1将信息系学生视图IS_Student中学号95002的学生姓名改为“刘辰”

UPDATE IS_Student

SET Sname='刘辰'

WHERE Sno='95002';

转换后的语句:

UPDATEStudent

SET Sname='刘辰'

WHERE Sno='95002' AND Sdept='IS';

在关系数据库中,并不是所有的视图都是可更新的,因为有些视图的更新不能唯一地有意义地转换成对相应基本表的更新。

一般地,

行列子集视图是可更新的,除此之外,还有一些视图理论上是可更新的,但他们的确切特征还是尚待研究的课题,还有些视图从理论上就是不可更新的。

删除视图

删除视图的语句格式:DROP VIEW ;

删除视图对生成视图的基本表没有任何影响。

删除基表时,由该基表导出的所有视图定义没有被删除,但已不能使用,必须使用DROP VIEW显式删除。

例子6.1

删除视图BT_S:

DROP VIEW BT_S;

删除视图IS_S1:

DROP VIEW IS_S1;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/264611.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

bzoj1190:[HNOI2007]梦幻岛宝珠

传送门 二进制分组优化背包 理解的差不多了&#xff0c;但是无法具体阐述&#xff0c;留坑 代码&#xff1a; #include<cstdio> #include<iostream> #include<algorithm> #include<vector> #include<cstring> using namespace std; void read(in…

JQuery常用的代码片段

2019独角兽企业重金招聘Python工程师标准>>> JQuery常用的代码片段 JQuery在当前众多网站开发中都有用到。他简易的操作以及对各个浏览器的兼容性&#xff0c;被广大的开发者一致看好。 下面是一些常用实用的 JQuery 代码片段。看看有没有需要收藏的吧&#xff1a; …

Lession 14 Do you speak Englist?

1过去完成时:1>动作发生在过去的过去;在过去动作完成,对过去产生影响,过去的时间壮语;2>原打算,但没实际的愿望;3>没听清,再次提问;had 过去分词2 New words and Expressions;amusing;experience;wave;lift;reply;language;journey;1>speak;speaker;say;说话内容;…

linux中mysql与eclipse_Linux下eclipse CDT及mysql安装,c++访问mysql数据库

5. 关于eclipse编译project由于程序中有#include所以需要在eclipse中加上对mysql.h的路径项目->属性->C/CBuild -> settings -> gcc c complier ->includes -> include paths添加两个路径&#xff1a;/usr/lib/mysql&#xff1b;/usr/include/mysql对于64位的…

linux环境配置

在安装linux之前首先要明白linux系统的功能特性&#xff0c;linux是多少位 的&#xff0c;对要使用的工具要有大体的了解&#xff0c;那样就不至于在之后的安装中耽误太多时间&#xff0c;比如安装的系统是32位的就要安装与之对应的工具。我们大体上了解一下linux能支持的又比较…

tomcat 启动速度慢背后的真相

1. tomcat 启动慢 在线上环境中&#xff0c;我们经常会遇到类似的问题&#xff0c;就是tomcat 启动比较慢&#xff0c;查看内存和cpu,io都是正常的&#xff0c;但是启动很慢&#xff0c;有的时候长达几分钟&#xff0c;这到底是什么原因导致的。 1.1 tomcat 获取随机值阻塞 ​ …

[导入]相片: 23853741.jpg

文章来源:http://img.blog.163.com/photo/NdAK9XEb2a-KOR7zpDWpAA/588564176302178421.jpg转载于:https://www.cnblogs.com/baiyirui/archive/2008/04/27/1173117.html

手摇泵PHP一32_节能手摇泵的制作方法

本实用新型属于液压动力装置技术领域&#xff0c;特指一种节能手摇泵。背景技术&#xff1a;如图1-2所示&#xff0c;目前&#xff0c;手摇泵采用分体式结构&#xff0c;比如&#xff0c;左横向出油通道和右横向出油通道是装配在泵体上的&#xff0c;由于零件较多&#xff0c;所…

2018-07-10 为Chrome和火狐浏览器编写扩展

由于扩展标准的逐渐一致, 现在同一扩展代码库已经有可能同时用于Chrome和火狐. 下面是一个简单的工具栏按钮和弹窗(尚无任何实际功能): 代码库地址: nobodxbodon/suan1 所有代码: manifest.json: {"manifest_version": 2,"name": "算一","v…

转基因大豆提高大豆油脂产量80%

2013年6月17日&#xff0c;农业部批准3种转基因大豆进口&#xff0c;可是&#xff0c;”准吃不准种“&#xff0c;请见《第一財经日报》相关报道。 据国外文献资料&#xff0c;“Soybean Oil: Genetic Approaches for Modification of Functionality and Total Content." …

掌握 ASP.NET 之路:自定义实体类简介 来源 :msdn

ADODB.RecordSet 和常常被遗忘的 MoveNext 的时代已经过去&#xff0c;取而代之的是 Microsoft ADO.NET 强大而又灵活的功能。我们的新武器就是 System.Data 名称空间&#xff0c;它的特点是具有速度极快的 DataReader 和功能丰富的 DataSet&#xff0c;而且打包在一个面向对象…

mysql数据库分表备份脚本_mysql 分库分表备份脚本

#!/bin/bashUSERroot #用户PASSWORD123456 #密码MYSQL_PATH127.0.0.1 #地址MYSQL_BIN/bin/mysqlMYSQL_DUMP_BIN/bin/mysqldumpMYSQL_CMD"${MYSQL_BIN} -u${USER} -p${PASSWORD} -h${MYSQL_PATH}"DATABASE($(${MYSQL_CMD} -e "show databases;"|egrep -v &q…

企业级 oracle11G r2 DataGuard 安装配置

企业级 oracle11G r2 DataGuard 安装配置安装环境IP地址与机器名 /etc/hosts# Do not remove the following line, or various programs# that require network functionality will fail.127.0.0.1 localhost.localdomain localhost::1 localhost6.local…

【LeetCode】390. 消除游戏

题目 给定一个从1 到 n 排序的整数列表。 首先&#xff0c;从左到右&#xff0c;从第一个数字开始&#xff0c;每隔一个数字进行删除&#xff0c;直到列表的末尾。 第二步&#xff0c;在剩下的数字中&#xff0c;从右到左&#xff0c;从倒数第一个数字开始&#xff0c;每隔一个…

mysql最大连接数512_MySQL服务器最大连接数怎么设置才合理

原标题&#xff1a;MySQL服务器最大连接数怎么设置才合理如果mysql 连接数据设置不合理可能会导致很小的流量mysql就提示MySQL: ERROR 1040: Too many connections错误了&#xff0c;那么要如何才算是合理设置mysql最大连接数呢&#xff0c;下面我来给大家介绍介绍。MySQL服务器…

Unity Mono

Unity的mscrolib.dll和.Net的mscrolib.dll 好奇于Unity的mscrolib.dll和.Net Framework提供的mscrolib是否一致。 .Net的mscrolib.dll 多语言标准通用对象运行时库&#xff08;Microsoft Standard Common Object Runtime Library&#xff09;就是指mscrolib.dll, Unity的mscrol…

【noip模拟赛3】编码

描述 Alice和Bob之间要进行秘密通信&#xff0c;他们正在讨论如何对信息进行加密&#xff1a; Alice&#xff1a;“不如采用一种很简单的加密方式&#xff1a;’A’替换成1&#xff0c;’B’替换成2&#xff0c;„„&#xff0c;’Z’替换成26。” Bob&#xff1a;“这种加密方…

HTML入门学习 -- HTML基础知识

打算按照 HTML -> CSS –> JavaScript –> jQuery –> HTML5 –> WebGL 的顺序&#xff0c;简略学习一下Web前端技术。 因为不是搞Web的&#xff0c;只需要大概过一下有个印象就行&#xff0c;每一项花费3天到一周时间走马观花的看看。 编辑器就选择Sublime Tex…

explorer.exe rundll32.exe病毒解决方案

1、网页打开速度突然变慢&#xff0c;彻底杀毒&#xff0c;没有发现。再查看进程&#xff0c;一开始只有rundll32.exe耗cpu资源90%以上&#xff0c;每结束一次进程&#xff0c;网页打开就快些&#xff0c;但需要不断的结束&#xff0c;第一次郁闷&#xff01;&#xff01;后来&…

python作用域链_具有动态特性的Python嵌套作用域

例如&#xff1a;>>> def outer():... x 0... y (x for i in range(10))... del x...SyntaxError: can not delete variable x referenced in nested scope基本上这意味着你不能删除内部块中使用的变量(在这种情况下是genexp)。在注意&#xff0c;这适用于python&am…