MySQL数据库12——视图(VIEW)

news2024/12/24 21:36:34

视图概念

视图是一个虚拟表,称其为虚拟表的原因是:视图内的数据并不属于视图本身,而属于创建视图时用到的基本表。可以认为,视图是一个表中的数据经过某种筛选后的显示方式;或者多个表中的数据经过连接筛选后的显示方式。

视图由一个预定义的查询(SELECT语句)组成,可以像基本表一样用于SELECT语句中。如果视图满足一定条件,还可以用在INSERT、UPDATE和DELETE语句中,对视图所调用的基本表进行插入、更新和删除数据操作。


视图案例

使用一个例题引入视图概念,并让读者初步了解视图的作用、定义视图的方法和使用视图的方法。

例 查询“心理学”考试成绩大于等于90的学生的“学号”、“姓名”和“所属院系”三个字段。

分析:“心理学”是course表中“课名”字段的值,考试成绩是score表中“考试成绩”字段的值,而“学号”、“姓名”和“院系”是student表中的字段。因此想要得到本例要求的结果,则必须对course、score和student三个表进行连接查询,如图 所示。

SELECT student.ID AS 学号, student.name AS 姓名, student.institute AS 所属院系 
FROM  student, course, score 
WHERE  course.course='心理学' 
       AND score.result1>90 AND student.ID=score.s_id AND course.ID= score.c_id;

 

如果用户经常使用上面的查询,并且每次都要编写这一复杂的SELECT语句,那会很麻烦。如果将上面的SELECT语句保存到数据库里,就是视图。

视图里存放了SELECT语句,而并非是查询结果。每次在SQL语句中使用视图,其实就是在执行视图内存放的SELECT语句,因此通过视图总能够得到最新的数据。

例如 定义一个视图vw1,将上例的SELECT语句存放到该视图内。

CREATE VIEW  vw1  AS SELECT student.ID  , student.name  , student.institute  
FROM  student,course,score   WHERE  course.course='心理学' 
AND score.result1>90 AND student.ID=score.s_id AND course.ID= score.c_id;

视图被定义后可以像基本表一样使用。例如,下面的例题在SELECT语句中使用了视图vw1。

例 在视图vw1上运行一个简单查询。

SELECT * FROM college.vw1;


使用视图的原因:

(1)能够简化用户的操作

(2)能使用户以多种角度观察同一个数据库

(3)视图对重构数据库提供了一定程度的逻辑独立性

(4)能够对机密数据提供安全保护

因为上述原因,数据库操作中经常使用视图。但使用视图为人们带来好处的同时,也带来了一些隐患。因此使用视图前,应当注意以下问题。

(1)改变基本表的结构后应当删除视图并重建视图。视图不能被修改,因此如果要对视图定义进行改变需要先删除再重建它。

(2)删除基本表时应当删除视图。视图本身没有数据,其数据都是基本表中的数据,当删除了基本表后,再运行视图时会产生错误信息。

(3)潜在的复杂性带来的性能下降问题。如果定义视图的SELECT语句非常复杂,例如连接了多个表或者嵌套了视图,则数据库系统除了执行访问视图的SELECT语句以外,还要执行定义视图的复杂SELECT语句,所以导致了系统性能下降。


视图的规则和限制

不同的数据库系统,对创建视图有不同的限制,所以在创建使用视图之前,应当查看具体数据库系统的帮助文档。下面整理了创建使用视图的一些较常见的规则和限制。

1.视图必须惟一命名。视图的名称不能和本数据库中的其它视图或者基本表名相同。
2.对于视图的创建个数没有限制。
3.为了创建视图,必须具有足够的访问权限。权限可以由数据库管理人员授予。
4.视图可以嵌套,即定义视图时的表源也是一个视图而并非基本表。对于嵌套的层数,不同的数据库系统有不同的规定,详细内容可以查看具体数据库系统的帮助文档。
5.有些数据库系统不允许在定义视图时直接使用ORDER BY子句,例如SQL Server,Oracle 8i及其以前的版本。
6.视图不能索引,也不能有相关联的触发器或默认值。
7.有些数据库系统把视图作为只读的查询,只能从视图查询数据,而不能将更改基本表数据。


创建视图的SQL语句

下面通过例题,具体说明创建视图的SQL语句的简单用法。

例 创建视图vw_ boy,它用于将表student中全部男生的信息显示出来。并使用视图vw_boy查询计科系的男生。

CREATE VIEW   vw_boy AS
SELECT  *  FROM   student 
WHERE  sex='男';

下面的语句用来显示计科系的男生。

SELECT * FROM vw_boy
WHERE institute='计科系';

例 创建一个基于视图vw_boy的视图vw_boy_computer,用于查询计科系男生的信息。

CREATE VIEW   vw_boy_computer  AS
SELECT  *  FROM   vw_boy 
WHERE institute='计科系';

 


利用视图提高数据安全性 

1、隐藏列数据

有时需要将表中的某些列隐藏起来,只显示指定的列,这时可以使用视图达到这种目的。具体方法如下面的例题所示。

例 创建一个只能查看“学号”、“姓名”和“性别”三个列的视图vw_student1。

CREATE VIEW  vw_student1 AS
SELECT  ID AS 学号, name AS 姓名, sex AS 性别  
FROM    student;

2、隐藏行数据

下面学习通过视图只显示指定条件的行数据,而隐藏其它数据的方法。

 例 创建一个只能查看计科系学生信息的视图vw_student2。

CREATE VIEW  vw_student2 AS
SELECT  *   FROM   student  
WHERE  institute='计科系';

 


利用视图得到汇总数据

可以使用视图对表中的数据进行及时汇总。这样通过对视图进行简单查询就可以得到复杂的汇总数据。而且,当基本表中的底层数据被改变时,通过视图得到的永远是最新的数据。

例 创建一个视图vw_student3,显示每个不同院系的学生人数。

CREATE VIEW  vw_student3 AS
SELECT  institute AS 所属院系, COUNT(*) AS 人数 
FROM student  GROUP BY institute;

使用视图查询汇总数据时,即使基本表中的数据改变了,视图也总能得到最新的信息,因为它每次都运行定义该视图的SELECT语句,而并非是将以前的查询结果显示出来。


利用视图简化计算字段的使用

 

使用视图还可以简化计算字段的使用。下面通过一个例题进行详细说明。

例 查询25岁~30岁之间(包含25岁,不包含30岁)的学生和33岁以上(包含33岁)的学生的姓名和年龄,并按年龄降序排序。

在student表中只有“出生日期”列,而并没有“年龄”列,所以必须通过对“出生日期”列进行计算后得出学生的“年龄”。下面先创建一个有年龄列的视图,然后对视图进行简单查询。

CREATE VIEW vw_age AS
SELECT name AS 姓名, TIMESTAMPDIFF(YEAR, birthday, CURDATE()) AS 年龄 
FROM   student;

查询:

SELECT  *   FROM   vw_age
WHERE 年龄>20 or 年龄<=18
ORDER BY 年龄 DESC;

 

本例中,如果不使用视图,则其查询语句不仅会显得很复杂,而且键盘输入量也会大大增加,例如下面的语句。

SELECT name AS 姓名,TIMESTAMPDIFF(YEAR, birthday, CURDATE()) AS 年龄 
FROM   student
WHERE  TIMESTAMPDIFF(YEAR, birthday, CURDATE())>=20  
          OR TIMESTAMPDIFF(YEAR, birthday, CURDATE())<=18
ORDER BY 年龄 DESC;

 利用视图简化多表连接

例 查询“教育学”考试成绩大于80的学生的“学号”、“姓名”和“所属院系”三个列。

为了让视图更具通用性,在此创建一个只是连接三个基本表相关列数据的视图。

CREATE VIEW vw_student_score AS
SELECT student.ID AS 学号, student.name AS 姓名, student.institute AS 所属院系,
       course.course AS 课名,score.result1 AS 考试成绩 
FROM  student, course, score 
WHERE student.ID=score.s_id  AND course.ID= score.c_id ; 

然后查询80分之上的:

SELECT 学号,姓名,所属院系
FROM vw_student_score
WHERE 课名='教育学' AND 考试成绩>80;

然后需要查看所有学生的平均考试成绩,查询结果按“学号”升序排序。

SELECT 学号,姓名, AVG(考试成绩) AS 平均考试成绩
FROM  vw_student_score 
GROUP BY 学号,姓名
ORDER BY 平均考试成绩;

 


视图删除

 例 从数据库中删除视图vw1。

DROP VIEW  vw1
 

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

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

相关文章

上手ElasticSearch必须了解的核心概念

ElasticSearch概述ElasticSearch&#xff08;简称 ES&#xff09; 是一个分布式的使用 REST 接口的搜索引擎&#xff0c;属于非关系型数据库。它是在 lucene 的基础上进行研发的&#xff0c;隐藏了 lucene 的复杂性&#xff0c;提供简单易用的 RESTful Api接口。ES 的分片相当于…

HTTP、WebSocket和Socket.IO

一、HTTP协议 HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;。HTTP 协议和 TCP/IP 协议族内的其他众多的协议相同&#xff0c; 用于客户端和服务器之间的通信。请求访问文本或图像等资源的一端称为客户端&#xff0c; 而提供资源响应的一端称…

七天实现一个go rpc框架

目录rpc协议目的关于RPC和框架服务端与消息编码确保接口的实现消息的序列化与反序列化通信过程服务端的实现main 函数支持并发与异步的客户端Call 的设计实现客户端服务注册(service register)通过反射实现 service集成到服务端超时处理创建连接超时Client.Call 超时服务端处理…

C语言(联合和枚举)

1.联合创建 联合是一种数据类型&#xff0c;它能在同一个内存空间中存储不同的数据类型&#xff08;非同时存储&#xff09; 创建联合和创建结构的方式相同&#xff0c;需要一个联合模板和联合变量。使用关键字union union hold{ int digit; double bigfl; char letter; } 以上…

十、STM32端口复用重映射

目录 1.什么是端口复用&#xff1f; 2.如何配置端口复用&#xff1f; 3.什么是端口重映射 &#xff1f; 4.什么是部分重映射和完全重映射&#xff1f; 5.重映射的配置过程 1.什么是端口复用&#xff1f; STM32有很多外设&#xff0c;外设的外部引脚与GPIO复用。也就是说一…

Vue|初识Vue

Vue是一款用于构建用户界面的JavaScript框架。它基于标准HTML、CSS和JavaScript构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助开发者高效地开发用户界面。 初识Vue1. Vue简介2. 开发准备3. 模板语法3.1 差值语法3.2 指令语法4. 数据绑定4.1 单向数据…

工厂模式详解

工厂模式 工厂模式顾名思义就是生产实例的工厂&#xff0c;使用工厂模式不会在程序中使用new关键字创建实例。而是将创建对象的细节隐藏&#xff0c;对外提供统一的方法&#xff0c;外部通过该方法获取实例。以此降低调用者与程序之间的耦合性&#xff0c;更加灵活 工厂模式可…

ccc-Brief Introduction of Deep Learning-李宏毅(6)

文章目录Three Steps for Deep LearningFully Connect Feedforward NetworkMatrix OperationOutput Layer as Multi-Class ClassifierExample ApplicationNeural NetworkGoodness of functionPick the best functionThree Steps for Deep Learning 与机器学习三步骤基本相同。 …

sql的case when用法详解

简单CASE WHEN函数&#xff1a; CASE SCORE WHEN A THEN 优 ELSE 不及格 END CASE SCORE WHEN B THEN 良 ELSE 不及格 END CASE SCORE WHEN C THEN 中 ELSE 不及格 END等同于&#xff0c;使用CASE WHEN条件表达式函数实现&#xff1a; CASE WHEN SCORE A THEN 优WHEN SCORE …

数据存储领域的“归档Archive”

档案圈的朋友想必对档案领域的“归档”一词已经耳熟能详&#xff0c;按照DA/T 58-2014《电子档案管理基本术语》中的定义&#xff0c;归档&#xff08;Archiving&#xff09;是指“按照国家规定将具有保存价值的电子文件及其元数据的保管权交给档案部门的过程”。 今天我们要聊…

FreeRTOS任务通知 | FreeRTOS十二

目录 说明&#xff1a; 一、任务通知 1.1、什么是任务通知 1.2、任务通知优势与劣势 1.3、任务通知值的更新方式 1.4、任务通知值状态 1.5、任务通知状态 1.6、任务通知方式类型 二、任务通知相关API函数 2.1、常用的发送通知API函数 2.2、带通知值的发送通知函数 …

STL中重要容器vector总结

你要尽全力保护你的梦想。那些嘲笑你的人&#xff0c;他们必定会失败&#xff0c;他们想把你变成和他们一样的人。如果你有梦想的话&#xff0c;就要努力去实现。 ——《当幸福来敲门》引言&#xff1a;C中STL里面的容器用法很巧妙&#xff0c;可以解决很多复杂的模型&#xff…

LEADTOOLS 22.0.6 UPDATE-Crack

OCR SDK 库 许多 OCR 增强功能 LEAD 行业领先的人工智能 OCR SDK 在以下方面获得了显着的识别优化&#xff1a;斜体、大写和小写字母、文本行组装和单词构建、列检测、基线检测和文本行分割。 LEADTOOLS为.NET 6、. NET Framework、Xamarin、UWP、C#、VB、C/C、Java、Objective…

OpenCV形态学处理

OpenCV形态学处理1、膨胀2、腐蚀3、开/闭运算4、示例膨胀、腐蚀、开运算、闭运算 1、膨胀 膨胀就是求局部最大值的操作&#xff0c;膨胀的数学表达式&#xff1a; dst⁡(x,y)max⁡(x′,y′):1ement⁡(x′,y′)≠0src⁡(xx′,yy′)\operatorname{dst}(x, y)\max _{\left(x^{\pr…

搭建mysql主从复制

前言&#xff1a; &#x1f44f; 作者简介&#xff1a;我是笑霸final&#xff0c;一名热爱技术的在校学生。 &#x1f4dd; 个人主页&#xff1a;个人主页1 || 笑霸final的主页2 &#x1f4d5; 系列专栏&#xff1a;数据库 &#x1f4e7; 如果文章知识点有错误的地方&#xff0…

缺失数据的处理

1&#xff1a;方括号里写数组&#xff0c;是对行进行操作&#xff0c;方括号里写字符串&#xff0c;是对列进行操作 dfdf.sort_values(byCount_AnimalName,ascendingFalse) #print(df.head(5)) print(df[:20]) print(df[Row_Labels]) print(type(b))2&#xff1a;t3.loc(定位取…

程序的编译与链接(预处理详解)+百度面试笔试题+《高质量C/C++编程指南》笔试题

本篇重点介绍程序的编译与链接过程中的预处理阶段&#xff0c;将详细的介绍在预处理阶段会发生什么&#xff0c;以及讲解有关百度该内容的面试笔试题和源于《高质量C/C编程指南》的笔试题。一.【预处理详解】①预定义符号②#define2.1 #define 定义标识符注意&#xff1a;2.2 #…

常见的EMC问题

电磁兼容设计的目的就在于满足产品功能要求、减少调试时间&#xff0c;使产品满足电磁兼容标准的要求&#xff0c;并且使产品不会对系统中的其它设备产生电磁干扰。 电磁兼容设计中常见的问题有哪些&#xff1f; 1、电磁兼容设计可以从电路设计&#xff08;包括器件选择&…

69. open函数—打开文件并返回文件对象

69. open函数—打开文件并返回文件对象 文章目录69. open函数—打开文件并返回文件对象1. open() 函数的作用2. open函数语法参考3. open()函数参数说明1. file参数2. encoding 参数3. errors参数4. mode参数4. mode参数详解1. 准备工作2. w 写入模式3. a 追加模式4. r 只读模式…

RabbitMQ学习总结(10)—— RabbitMQ如何保证消息的可靠性

一、丢失场景 RabbitMQ丢失的以下3种情况: (1)生产者:生产者发送消息至MQ的数据丢失