MySQL:视图【详解】

news2024/11/15 4:58:11

1、视图

1.1 视图的定义

视图是在数据库中定义的虚拟表。它是一个基于一个或多个实际表的查询结果集,可以像实际表一样被查询和操作。视图可以看作是一个动态生成的数据表,其内容是从其他表中选择、过滤和计算得到的。

视图通过使用SQL查询语句来定义,这些查询语句可以包括与一个或多个表的连接、条件过滤、列计算、聚合函数等操作。在视图定义中,我们可以指定要在视图中包含的列和行,以及对这些列进行何种计算和处理。

1.2 为什么要使用视图

视图的使用有两大因素:

1.保护敏感数据:当我们使用 select+表名 的形式执行查询操作时,查询出的数据是不受约束的,当数据中含有用户的隐私数据如:密码、地址、身份证号码时,那么使用 select+表名 的形式,这些隐私数据将暴露无遗,而视图可以有效防止隐私的暴露,隐藏关键字段,避免别有用心之人的利用。

2.降低开发成本:当开发人员需要联合多张表查询时,那么这时的查询语句将会非常的复杂,而每次查询都需要重新编写这些SQL语句,这将非常影响工作效率,那么这时数据库开发人员就可以将这些SQL语句抽象到视图中,开发人员查询时就可以通过视图进行查询。

  • 例如:查询用户的所有信息和考试成绩(四表联合查询)
-- 查询用户的所有信息和考试成绩(四表联合查询)
SELECT
 st.student_id, st.`name`, 
 cl.class_id, cl.`name`, 
 co.course_id, co.name,
 sc.score
 FROM 
 student st, class cl, score sc, course co
 WHERE 
 st.class_id = cl.class_id AND
 sc.student_id = st.student_id AND
 co.course_id = sc.course_id
 ORDER BY 
 st.student_id;

每次查询时都需要编写这样复杂的SQL语句,这是非常影响效率的,并且可以任意指定列查看隐私数据,此时我们就可以将这些语句抽象到视图中,既提高了开发效率,又保护了用户隐私。

2、 视图的创建

上文已经讲到,视图的使用可以降低开发成本,我们只需创建视图,将相关SQL语句抽象到视图中,通过视图来查询即可。

2.1 不指定列名的创建

创建视图时,我们可以不指定视图中的列名,仅仅通过AS后SQL语句的结果集中的列名来当做视图中的列。

而当我们通过视图查询时,结果如下:

为什么会出现列名重复的错误提示呢?

—— 这是由于我们在定义视图时没有指定列名,这时视图中的列是由结果集中的列决定的,而结果集中的列出现了多个重复的列‘name’,所以出现了列名重复的报错信息。

此时,我们只需将结果集中的列起上不同的别名,让这些列名不重复即可:

 -- 定义视图
 -- 不指定列名的视图的定义
 CREATE VIEW v_student_score AS (
	 SELECT
	 st.student_id, 
	 st.`name` student_name, #结果集中列名重复时要起别名
	 cl.class_id, 
	 cl.`name` class_name, 
	 co.course_id, 
	 co.`name` course_name,
	 sc.score
	 FROM 
	 student st, class cl, score sc, course co
	 WHERE 
	 st.class_id = cl.class_id AND
	 sc.student_id = st.student_id AND
	 co.course_id = sc.course_id
	 ORDER BY 
	 st.student_id
 );

创建成功后,我们可以使用 show tables; #查看视图

我们也可以通过,show create view 视图名; #查看创建视图的SQL语句

 -- 查看试图
 SHOW TABLES;
 -- 查看创建视图的SQL语句
 SHOW CREATE VIEW v_student_score;

2.2 指定列名的创建

我们也可以在创建视图时指定列名,此时有一个好处:指定列名之后,视图会根据指定的列名创建,查询结果集中是否有重复的列名并不影响。 

也就是说,此时我们不需要关注结果集中是否有重复的列名,也不需要给重复的列名起别名。

例如:(注意,本示例创建的视图并未使用order by子句) 

-- 定义视图
 -- 指定列名的视图的定义
 CREATE VIEW v_student_score_v1 (
 id, name, class_id, class_name, course_id, course_name, score
 ) AS (
	 SELECT
	 st.student_id, 
	 st.`name`,
	 cl.class_id, 
	 cl.`name`, 
	 co.course_id, 
	 co.`name`, #不需要给结果集中重复的列起别名
	 sc.score
	 FROM 
	 student st, class cl, score sc, course co
	 WHERE 
	 st.class_id = cl.class_id AND
	 sc.student_id = st.student_id AND
	 co.course_id = sc.course_id
 );

注意:上述的两种创建方式都是可以的,推荐使用第二种,即指定列名的创建


3、 视图的使用

我们可以通过封装的视图来进行查询操作:

注意,上文已经提到 视图v_student_v1 是未进行排序的视图,在查询时,我们可以给视图中的结果集指定排序规则:

 -- 使用视图
 SELECT * FROM v_student_score_v1 ;
 -- 使用视图 --> 对score进行升序排序	
 SELECT * FROM v_student_score_v1 ORDER BY score ;

4、 视图与基础表的相互影响

接下来让我们一起探索视图与基础表间数据修改之间的关系。

4.1 更新基础表数据

我们先来探索在基础表中修改的数据是否能影响到视图。

先上总结:在基本表中修改的数据会影响到视图中。

接下来让我们一步一步验证:

第一步:我们现在先来修改基础表中的数据:

第二步:使用视图查询,查看修改的数据是否影响到视图:

 综上:在基本表中修改的数据会影响到视图中。

-- 查看修改前的基础表
 SELECT * FROM score WHERE student_id = 1 AND course_id = 1;
 
 -- 更新基础表数据
 -- 将id = 1 的学生 course_id = 1 的课程成绩修改为100
 UPDATE 
 score 
 SET score = 100 
 WHERE 
 student_id = 1 AND 
 course_id = 1;
 
  -- 查看修改后的基础表的成绩
 SELECT * FROM score WHERE student_id = 1 AND course_id = 1;
 
 -- 查看视图中的数据是否收到影响
 select * FROM v_student_score_v1;

4.2 更新视图数据

4.2.1 视图是否可进行更新操作

我们先来更新 视图v_student_score,即上文创建时没有指定列名的但指定了order by排序规则的视图。

第一步:我们在v_student_score视图中将刚才修改为100的成绩修改为80,:

出现了上图的报错,提示我们:视图中如果使用了group by子句,则视图不能进行更新update操作。

OK,我们还有一个没有使用order by的视图,即:v_student_score_v1,我们继续在这个视图中进行update操作。

第二步:我们继续在v_student_score_v1视图中进行update操作。

注意:若视图指定了列名,则修改数据时,一定要使用视图中指定的列名,因为视图创建后,与基础表间已实现断藕。

发现,在该视图中成功更新了数据。

故综上:当在视图中使用order by 时,不允许在视图中进行更新update操作。

但在视图中,不仅仅是只有使用了order by语句才不允许进行更新操作,

使用了以下SQL,不允许在视图中进行update操作:

  1. 使用聚合函数
  2. 使用distinct
  3. 使用order by
  4. 使用group by以及having子句
  5. 使用union或union all
  6. 查询列表时,使用子查询
  7. 在from子句中引用不可更新的视图

4.2.2 视图更新对基础表的影响

同样,先上结论:更新视图中的数据同样会影响到基础表。

通过进行视图和基础表间数据更新的实验,得出以下结论:

  • 不论更新了视图还是基础表,都会相互影响,查询处来的数据都是最新结果。
  • 即:修改基础表会影响视图,修改视图也会影响基础表。
 -- 更新视图
 UPDATE v_student_score_v1 SET score = 80 WHERE id = 1 AND course_id = 1;
 
 -- 查看基础表数据 --> 发现基础表受影响
 SELECT * FROM score WHERE student_id = 1 and course_id = 1;

 5、视图的删除

语法:drop view 视图名;


6、视图的优点

  •  简单性:不用编写复杂的SQL,只通过使用公开对外提供的视图来查询数据。

  • 安全性:通过视图,可以隐藏表中的敏感数据。

  • 逻辑数据独立性:视图可以指定列名,所以不论底层表结构如何变化,底层列名如何变化,只需修改视图的定义即可,视图指定的列名仍然为原来的名称,这样实现了应用程序与数据库的解耦,不管应用程序改了什么内容,只认数据库的视图,不用"牵一发而动全身"。

  • 重命名列:视图允许用户重命名列名,以增强数据可读性。


END

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

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

相关文章

Framebuffer应用编程

目录 前言 LCD操作原理 涉及的 API 函数 open函数 ioctl 函数 mmap 函数 Framebuffer程序分析 源码 1.打开设备 2.获取LCD参数 3.映射Framebuffer 4.描点函数 5.随便画几个点 上机实验 前言 本文介绍LCD的操作原理和涉及到的API函数,分析Framebuffer…

配置全新服务器深度学习一套流程

目录 1.安装anaconda2.配置cuda3.配置cudnn4.配置新的pytorch环境5.安装rdkit包6.小问题记录 1.安装anaconda 直接参考视频 总结: 1.下载anaconda安装包,尽量不下载最新的版本 2.bash 对应安装包,一直回车,yes 3.配置环境vim ~/.…

点餐小程序实战教程10权限验证

目录 1 创建员工的全局变量2 创建员工首页3 跳转到员工首页4 给全局变量赋值5 验证权限6 登录的完整代码总结 我们已经实现了员工的注册及登录功能,登录成功后需要跳转到我们的员工首页。在首页加载的时候我们需要去验证当前用户是否已经登录,未登录我就…

深入理解数据分析的使用流程:从数据准备到洞察挖掘

数据分析是企业和技术团队实现价值的核心。 5 秒内你能否让数据帮你做出决策? 通过本文,我们将深入探讨如何将原始数据转化为有意义的洞察,帮助你快速掌握数据分析的关键流程。 目录 数据分析的五个核心步骤1. 数据获取常用数据获取方式 2. 数…

synchronized的详解、锁的升级过程和优缺点比较

本文 详细介绍Java中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级 锁、重量级锁,以及锁升级过程。 Java中每一个对象都可以作为锁。具体表现形式为以下三种形式: 对于普通的同步方法,锁是当前的实例对象对于静态同步方法&a…

攻防世界--->秘密-银河-300

做题笔记。 适用于reverse的隐写术。。。。啊哈哈哈哈 下载 查壳。(用的WSL->Debian) 64ida打开。 运行程序如下: 反汇编看不出来什么名堂,那就去看汇编代码。 下个断点。 东看看西看看 这是我们程序打印代码 往下翻: SECRET 秘密。 我…

路径规划 | 基于A*算法的往返式全覆盖路径规划的改进算法(Matlab)

目录 效果一览基本介绍程序设计参考文献 效果一览 基本介绍 基于A*算法的往返式全覆盖路径规划的改进算法 matlab实现代码 往返式全覆盖路径规划,通过建立二维栅格地图,设置障碍物,以及起始点根据定义往返式路径规划的定义的优先级运动规则从…

网页本地存储

网页本地存储 <html> <script>//添加数据function add(){var text;textdocument.getElementById(text).value;indexlocalStorage.length1;localStorage.setItem(index,text);}//显示localStorage所有内容function showall(){storagelocalStorage;var length stor…

209.长度最小的子数组(滑动窗口类)

文章目录 209.长度最小的子数组滑动窗口904. 水果成篮76. 最小覆盖子串 209.长度最小的子数组 209.长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 s &#xff0c;找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组&#xff0c;并返回其长度。如果不存在符合…

2020ICPC上海 D - Walker M - Gitignore

D: 首先显然要二分,判断当前二分的mid时间下是否能满足走满0~n 枚举所有情况,这里按照左,右起点p1,p2分别讨论 p1向左 p2向左(以下向左和向右都代表向左或者向右到墙,而不代表初速度方向)&#xff0c;只需要计算p1或者p2反弹之后还能走距离n就是合法 p1向左 p2向右&#xff…

C++在Linux实现多线程和多进程的TCP服务器和客户端通信

多进程版本 服务器 #include <arpa/inet.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <sys/wait.h> #include <signal.h> #include <string&…

软件设计师——程序设计语言

目录 低级语言和高级语言 编译程序和解释程序 正规式&#xff0c;词法分析的一个工具 有限自动机 ​编辑 上下文无关法 ​编辑 中后缀表示法 杂题 ​编辑 低级语言和高级语言 编译程序和解释程序 计算机只能理解由0、1序列构成的机器语言&#xff0c;因此高级程序设计…

CAD_Electrical 2022使用记录

一、CAD软件实用调整 1、如何调节窗口背景颜色 例如&#xff1a;将图中白色的背景色调节为黑色。 步骤&#xff1a;在CAD空白区域点击右键 -> 点击选项 -> 在显示中点击颜色(窗口元素) -> 将二维模型空间统一背景的颜色修改成需要的颜色 2、如何调节关标大小 例如&a…

IP纯净度对跨境电商有哪些影响

在全球化贸易的浪潮中&#xff0c;跨境电商凭借其打破地理界限的能力&#xff0c;成为推动国际贸易的重要力量。然而&#xff0c;跨境电商的运营并非没有挑战&#xff0c;其中IP纯净度是影响其成功的关键因素之一。本文将探讨IP纯净度对跨境电商运营的多方面影响&#xff0c;并…

Linux基础---08软件的安装

安装方式优缺点编译安装自由定制&#xff0c;但较为繁琐rmp安装安装简单&#xff0c;但需要自己解决依赖&#xff0c;不支持定制yum安装自动解决rmp依赖&#xff0c;但不支持定制&#xff08;用的更多&#xff09; 下面就具体介绍三大安装方式&#xff1a; 一.编译安装 用Li…

2024/9/15 408“回头看”之应用层小总结(下)

域名系统DNS: 本地域名服务器 本地域名服务器起着代理的作用&#xff0c;会将报文转发到根域名服务器、顶级域名服务器、权限域名服务器。 递归查询&#xff1a; 迭代查询&#xff1a; 文件传送协议FTP: FTP客户和FTP服务器之间使用的是tcp连接。 控制连接使用21端口&…

长业务事务的离线并发问题

事务指代一组操作同时成功或同时失败&#xff0c;事务可分为两类&#xff1a; 系统事务&#xff1a;即关系数据库事务&#xff0c;一次数据库连接中由start transaction或begin开启&#xff0c;commit表示提交&#xff0c;rollback表示回滚&#xff1b;业务事务&#xff1a;完…

海外VS国内:网安上市公司人均创收对比

二级市场分析章节中分析了中国网络网络安全上市公司人均创收63.2万、人均毛利37.6万&#xff0c;人均创利-1.6万。 有网友问了&#xff1a;海外网络安全公司的人均情况如何&#xff1f;那么让我们一起看看吧。 我们统计了在海外上市的28家主要网络安全公司的2023年的人均情况&…

Python互相关统计学 地震学 心理学 数学物理和算法模型及数据科学应用

&#x1f3af;要点 同步时间序列数据地震时频域信息绘制地震噪声干涉图和频谱计算光变曲线和时滞互相关光变曲线并计算峰值和质心图像几何对应关系算法气候相关矩阵图测量麦克风间距离图像相似性量化及显着性统计测试个体同步性量化分析计算绘制有无泊松噪声的光曲线地震幅度和…

通信工程学习:什么是接入网(AN)中的CF核心功能

接入网&#xff08;AN&#xff09;中的CF核心功能 在通信工程中&#xff0c;CF&#xff08;Core Function&#xff09;通常指的是核心功能&#xff0c;它是接入网&#xff08;AN&#xff09;中的一个重要组成部分。CF的主要作用是将用户或业务端口的承载要求与公共传送承载进行…