当前位置: 首页 > news >正文

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

视图概念

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

视图由一个预定义的查询(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
 

相关文章:

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

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

第四代英特尔至强重磅发布,芯片进入下半场:软硬加速、绿色可持续

编辑 | 宋慧 出品 | CSDN 云计算 2023 年的第二周&#xff0c;英特尔重磅发布其企业级芯片领域重要的产品——第四代英特尔 至强 可扩展处理器。作为数据中心处理器当之无愧的王牌产品&#xff0c;迄今为止&#xff0c;英特尔已经向全球客户交付了超8500万颗​至强可扩展处理器…...

c++-运算符函数与运算符重载

目录概述例子注意问题概述 运算符重载是函数一个特殊情况&#xff0c;重载的运算符视为特殊的函数&#xff0c;称为运算符函数。 编译系统能依据使用运算符的不同环境&#xff0c;即参数&#xff08;操作数&#xff09;的数量或类型的差异&#xff0c;区分同一运算符的不同含义…...

【MySQL Shell】8.9.3 修复 InnoDB ClusterSet 中的成员服务器和集群

根据集群的问题或维护要求&#xff0c;可以使用以下操作来处理其成员服务器。除非另有说明&#xff0c;否则请使用使用 InnoDB Cluster 管理员帐户或服务器配置帐户获取的 Cluster 和 ClusterSet 对象&#xff0c;以便存储在 ClusterSet 对象中的默认用户帐户具有正确的权限。 …...

宝塔搭建实战php开源likeadmin通用管理pc端nuxt3源码(三)

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 昨天给大家分享了admin前端的搭建部署方式&#xff0c;今天来给大家分享pc端在本地搭建&#xff0c;与打包发布到宝塔的方法&#xff0c;希望能够帮助到大家&#xff0c;感兴趣的朋友可以自行下载学习。 技术架构…...

【C++】---Stack和Queue的用法及其模拟实现

文章目录Stack最小栈栈的弹出压入序列逆波兰表达式求值用栈实现队列模拟实现queue用队列实现栈模拟实现Stack stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行元素的插入与提取操作。它的使用和之前学习的ve…...

Python GUI编程

Python 提供了多个图形开发界面的库&#xff0c;几个常用 Python GUI 库如下&#xff1a; Tkinter&#xff1a; Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口 .Tk 和 Tkinter 可以在大多数的 Unix 平台下使用,同样可以应用在 Windows 和 Macintosh 系统里。Tk8…...

2023年浙江水利水电施工安全员精选真题题库及答案

百分百题库提供水利水电施工安全员考试试题、水利水电施工安全员考试预测题、水利水电施工安全员考试真题、水利水电施工安全员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 119.下列关于大模板按照的说法正确的是&#x…...

Solon2 开发之插件,三、插件体外扩展机制(E-Spi)

插件体外扩展机制&#xff0c;简称&#xff1a;E-Spi。用于解决 fatjar 模式部署时的扩展需求。比如&#xff1a; 把一些“业务模块”做成插件包放到体外把数据源配置文件放到体外&#xff0c;方便后续修改 其中&#xff0c; .properties 或 .yml 文件都会做为扩展配置加载&a…...

数据结构与算法(Java版) | 数据结构与算法的关系

从这一节起&#xff0c;咱们就要开始进入到「第二章——数据结构与算法的介绍」的学习中了&#xff0c;总的来说&#xff0c;第二章要讲解的内容其实也不是特别的多&#xff0c;内容也多偏理论&#xff0c;相信大家学起来是会比较轻松愉快的。 接下来&#xff0c;就请大家跟随…...

华科万维C++章节练习3_7

题目&#xff1a; 编程实现两种温度体系华氏温度和摄氏温度的相互转换; 以F作为华氏温度体系的单位&#xff0c;以C作为摄氏温度体系的单位。 要求当输入以F作为单位的温度值时(温度值范围[-500F~500F]&#xff0c; 否则提示“数据输入有误!”&#xff09;将其转换为对应的摄氏…...

CHAPTER 5 Jenkins SonarQube

Jenkins & SonarQube5.1 安装SonarQube1. 下载镜像2. 导出到其他服务器3. 准备工作4. docker-compose文件5. 启动容器5.2 登录SonarQube1.登录2. 安装中文语言插件3. 安装其他插件5.3 部署扫描器sonar-scanner1. 部署sonar-scanner2. 新建项目3. 扫描代码4. 查看报告5.4 Je…...

[AAAI 2023] Oral : Zero-shot 零样本/ Few-shot 少样本收录论文集合

零样本 (7篇)&#xff1a; CALIP: Zero-Shot Enhancement of CLIP with Parameter-free AttentionGuo Ziyu; Zhang Renrui; Qiu Longtian; ma Xianzheng; Miao Xupeng; He Xuming; Cui BinMaximum Entropy Population-Based Training for Zero-Shot Human-AI CoordinationZhao …...

驱动开发 2.13

设备树 设备树就是一种描述硬件信息的树形结构&#xff0c;设备树上有很多设备节点&#xff0c;每一个设备节点都描述了一个硬件设备信息&#xff0c;设备节点中也可以再包含子设备节点和设备属性&#xff0c;同一个节点的不同属性是以链表结构存储&#xff0c;设备树有.dts设…...

【数据库】sql函数和多表关联查询

目录 一&#xff0c;SQL函数 1&#xff0c;聚合函数 1&#xff0c; count函数 2&#xff0c; AVG函数 3&#xff0c; SUM函数 4&#xff0c; MAX函数 5&#xff0c; MIN函数 6&#xff0c;数据分组——GROUP BY 7&#xff0c;限定组的结果&#xff0c;HAVING 8&#x…...

6-周赛332总结

6-周赛332总结 过了Q1和Q2&#xff0c;Q2知道用二分但是边界处理的不是很好&#xff0c;迷迷糊糊过的&#xff08;手动再移动了下返回值…&#xff09; Q3知道将子字符串的值取出来&#xff0c;将最短位置放在哈希表中&#xff0c;然后异或在哈希表中找值。但是我这个猪头脑袋…...

嵌入式Qt 开发一个音乐播放器

上篇文章&#xff1a;RK3568源码编译与交叉编译环境搭建&#xff0c;进行了OK3568开发板软件开发环境搭建&#xff0c;通过编译RK3568的源码&#xff0c;可以得到Qt开发的交叉编译相关工具。 本篇&#xff0c;就来在搭建好的软件开发中&#xff0c;进行Qt软件的开发测试。由于…...

2023秋招万得集团AI算法岗面经分享

本专栏分享 计算机小伙伴秋招春招找工作的面试经验和面试的详情知识点 专栏首页:秋招算法类面经分享 主要分享计算机算法类在面试互联网公司时候一些真实的经验 2022年 11.22下午AI算法岗面试 (1)一面35min 1、自我介绍 2、科研:长文本MRC...

RoI Transformer论文翻译详解

Learning RoI Transformer for Oriented Object Detection in Aerial Images 0.摘要 航空图像中的目标检测是计算机视觉中一个活跃而又具有挑战性的任务&#xff0c;因为它具有鸟瞰视角、高度复杂的背景和变化的物体外观。特别是在航空图像中检测密集的目标时&#xff0c;基于…...

Prometheus 自动发现监控AWS EC2实例

本文章简述对接自动发现AWS云EC2实例 前提环境&#xff1a; PromethuesGrafanaAWS IAM权限 涉及参考文档&#xff1a; AWS EC2Grafana 通用监控模板 一、IAM 用户创建 1、创建Prometheus 策略 策略规则&#xff1a; {"Version": "2012-10-17",&quo…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…...

【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?

FTP&#xff08;File Transfer Protocol&#xff09;本身是一个基于 TCP 的协议&#xff0c;理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况&#xff0c;主要原因包括&#xff1a; ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...

6.9-QT模拟计算器

源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...

【题解-洛谷】P10480 可达性统计

题目&#xff1a;P10480 可达性统计 题目描述 给定一张 N N N 个点 M M M 条边的有向无环图&#xff0c;分别统计从每个点出发能够到达的点的数量。 输入格式 第一行两个整数 N , M N,M N,M&#xff0c;接下来 M M M 行每行两个整数 x , y x,y x,y&#xff0c;表示从 …...

AT模式下的全局锁冲突如何解决?

一、全局锁冲突解决方案 1. 业务层重试机制&#xff08;推荐方案&#xff09; Service public class OrderService {GlobalTransactionalRetryable(maxAttempts 3, backoff Backoff(delay 100))public void createOrder(OrderDTO order) {// 库存扣减&#xff08;自动加全…...

以太网PHY布局布线指南

1. 简介 对于以太网布局布线遵循以下准则很重要&#xff0c;因为这将有助于减少信号发射&#xff0c;最大程度地减少噪声&#xff0c;确保器件作用&#xff0c;最大程度地减少泄漏并提高信号质量。 2. PHY设计准则 2.1 DRC错误检查 首先检查DRC规则是否设置正确&#xff0c;然…...

Java + Spring Boot + Mybatis 插入数据后,获取自增 id 的方法

在 MyBatis 中使用 useGeneratedKeys"true" 获取新插入记录的自增 ID 值&#xff0c;可通过以下步骤实现&#xff1a; 1. 配置 Mapper XML 在插入语句的 <insert> 标签中设置&#xff1a; xml 复制 下载 运行 <insert id"insertUser" para…...