SQL基础理论篇(八):视图

文章目录

  • 简介
  • 创建视图
  • 修改视图
  • 删除视图
  • 总结
  • 参考文献

简介

视图,即VIEW,是SQL中的一个重要概念,它其实是一种虚拟表(非实体数据表,本身不存储数据)。

视图类似于编程中的函数,也可以理解成是一个访问数据的接口。

在这里插入图片描述

从上图可以看出,视图实际上是一种介于数据表和用户之间的虚拟表。正常情况下,用户本来就可以跟数据表直接交互,那在中间放一个view层,相比有什么好处呢?

我简单介绍一下我的理解:

  • 针对开发人员来讲,可以简化每次查询的步骤,对于一些固定化的查询,可以将其保存成视图,下次直接调用视图,而不需要重新书写查询(类似一个查询函数)。
  • 权限管理功能(安全性)。可以针对不同的用户,制定不同的查询视图。用户只对部分数据有查看权限,而不可窥全豹。

比如说一张表有用户的身份证信息,我不想对外部人员提供这种敏感字段,但我必须给他提供这张表中的其他信息,比如说用户的性别、年龄等,那我就有两种方式来解决这个问题:

  1. 新建一个实体表。把原表的身份证字段去掉,剩下数据导入这个新实体表,对外提供新实体表;(缺陷显而易见,空间浪费,同步更新等,优点是查的快)
  2. 使用view,筛掉身份证字段。(没有空间占用,自动同步更新等,但每次查询都要重新计算,因此查的会慢)

创建视图

以MySQL为例,其创建视图的语法:

create view view_name as
select column_1, column_2,...
from table_name
where condition

可以看到,视图是建立在SQL查询的基础上,封装成了一个视图。

这样就会基于SQL查询的结果集来形成一张虚拟表。但是这个虚拟表并不占用数据存储空间,每次调用视图都是跑一遍查询,将结果集缓存在内存中的过程,所以被称为是虚拟表,视图每次查出来的数据都是新的。

还有比较重要的一点,上面的语法中只用了一张表,只是为了简化演示,实际上view封装的SQL查询跟正常的查询没有区别,你可以join任意多个表来创建一个视图

当视图创建完之后,就可以直接作为一张表来使用了:

select * from view_name

另外,允许嵌套视图的存在。即可以在视图的基础上基础创建视图

create view view_name as
select column_1, column_2
from view_name_a
where condition

或者把视图作为子查询的内表都可以。

实际上,在某些情况下,你可以这么写:

delete from view_name where condition

(据说)如果视图是基于单表的,那源table中符合情况的数据,大概率会被删掉;但如果视图中join了多个表,那么这种delete基本不会成功,因为修改会涉及多个实体表。

这个需要注意,不要对视图进行任何update操作!!! 因为有可能会改掉底层数据。

修改视图

alter view view_name as
select column_1, column_2
from view_name
where condition

可以看到,修改视图的语法跟创建视图完全一样。

我觉得alter内部就是先删除老视图,然后再重新create。。。

提一句SQLite,这个轻量级数据库,并不支持修改视图,即只能使用CREATE和DROP,如果想要修改视图的话,只能先DROP,后重新CREATE。

删除视图

drop view view_name

总结

视图只是虚拟表,它只是封装了底层数据表的查询接口,因此有些RDBMS不支持对视图创建索引。(有的支持,如新版本的SQL server)。

再次总结下视图的好处:

  1. 安全性:视图是基于底层实体数据表的,使用视图时,一般不会通过视图来对底层数据进行修改,大部分情况下都会限制这种修改操作,在一定程度上保证了底层表的安全性。(但是在某些情况下的确是可以通过update视图来改变底层数据的,所以视图的安全性并不绝对);另外,针对不同用户,提供不同的视图来借此开放不同的数据权限,也是安全性的一个体现;
  2. 简单清晰:视图是对SQL查询的一个封装,实际上就是一个函数,把(可能会多次使用的)复杂的查询提前写成模块,既简化了调用,又方便了查询的复用。同时,嵌套视图这一设计,类似模块化编程,大大提升了查询的可复用。

那接下来还有最重要的一个问题,视图跟临时表相比,有什么优劣?(前面简单介绍了一下)

首先,临时表其实可以分两种,一种是SQL中的临时表,即在一次查询中临时存在的表,查询连接结束后,临时表就会被自动释放;另一种是我们口头意义上的临时表,是可以持久保存的实体表,其实就是新建一张表,然后把数据放进去。

视图胜在可以自动更新啊,如果要手动维护一张实体临时表的话,太麻烦,每次有更新之后还需要手动导进去。

参考文献

  1. 12丨视图在SQL中的作用是什么,它是怎样工作的?

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VPX 插座(VITA46)介绍及应用 (简单介绍)

1. VPX 插座的介绍 VPX是VITA(VME International Trade Association, VME国际贸易协会)组织于2007年在其VME总线基础上提出的新一代高速串行总线标准。VPX总线的基本规范、机械结构和总线信号等具体内容均在ANSI/VITA46系列技术规范中定义。VPX就是基于高速串行总线的新一代总线…

基于Surfer与Voxler数据处理及可视化实践技术应用

Surfer和Voxler分别是美国Golden Software 公司开发的用于二维和三维数据可视化软件,具有强大的数据处理和插值功能,软件主要应用于气象、环境和地质(以及生物、医学等)等领域。其中Surfer主要用于绘制二维等值线图、三维表面图以…

仪表盘:pyecharts绘制

一、仪表盘 在数据分析中,仪表盘图(dashboard)的作用是以一种简洁、图表化的方式呈现数据的关键指标和核心信息,以帮助用户快速理解数据的情况,并从中提取关键见解。 仪表盘图通常由多个图表、指标和指示器组成&…

Java —— String类

目录 1. String类的重要性 2. 常用方法 2.1 字符串构造 2.2 String对象的比较 2.3 字符串查找 2.4 转化 1. 数值和字符串转化 2. 大小写转换 3. 字符串转数组 4. 格式化 2.5 字符串替换 2.6 字符串拆分 2.7 字符串截取 2.8 其他操作方法 2.9 字符串常量池 2.9.1 创建对象的思考…

基于安卓android微信小程序的刷题系统

项目介绍 面试刷题系统的开发过程中,采用B / S架构,主要使用jsp技术进行开发,中间件服务器是Tomcat服务器,使用Mysql数据库和Eclipse开发环境。该面试刷题系统包括会员、答题录入员和管理员。其主要功能包括管理员:个…

芯片IO口不加电阻会怎样?

芯片IO口不加电阻会怎样? 可能会导致以下几个后果: 1.高电流问题,IO口没有电阻限流,当与外部设备直接连接时,就可能会导致过大的电流流过IO口,这就可能损坏IO口,引起短路或烧坏其它电路组件。像…

Spring Boot要如何学习?【云驻共创】

Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。我这里会分享一些学习Spring Boot的方法和干货,包括…

【C++】泛型编程 ⑨ ( 类模板的运算符重载 - 函数声明 和 函数实现 写在同一个类中 | 类模板 的 外部友元函数问题 )

文章目录 一、类模板 - 函数声明与函数实现分离1、函数声明与函数实现分离2、代码示例 - 函数声明与函数实现分离3、函数声明与函数实现分离 友元函数引入 二、普通类的运算符重载 - 函数声明 和 函数实现 写在同一个类中三、类模板的运算符重载 - 函数声明 和 函数实现 写在同…

Java实现windows系统截图

Java提供了一种方便的方式来截取Windows系统的截图。这个过程通常需要使用Java的Robot类来模拟用户的鼠标和键盘输入操作。下面将介绍如何使用Java实现Windows系统截图。 步骤1:导入Robot和AWT包 Java提供了一个Robot类,它可以模拟用户的键盘和鼠标操作…

医疗器械维修售后技术培训与支持的重要性

医疗器械维修售后技术培训与支持的重要性 随着我国医疗器械产业的的高速发展、医疗器械企业的崛起,大量创新医疗器械产品进入医疗机构。但医疗设备在使用和维护过程中,暴露出许多问题和不足,如部分设备故障率较高、临床工程培训不足、售后服务模式整体比较落后等,这影响了医疗…

当前系统并无桌面环境,或无显示器,无法显示远程桌面,您需要自行安装X11桌面环境,或者使用终端文件功能

ToDesk远程遇到的问题如上图,换向日葵直接黑屏; 问题原因 截止发文时间,Todesk只支持X11协议,没有适配最新的Wayland协议,所以我们需要把窗口系统调整为X11才可以。 解决方法 修改配置文件,关闭wayland su…

c# 文件读取和写入

文件写入 using System.Collections.Generic; namespace demo1;/// <summary> /// System.IO下的所有的Stream类是所有数据流的基类 /// 流是用于传输数据的对象&#xff0c;流就是用来传输数据的 /// 数据传输的两种方式&#xff1a;1、数据从外部源传输到程序中&#…

技术互联 创新交流 | 广汽研究院举办技术交流会圆满落幕

技术互联 创新交流 2023年11月1日&#xff0c;同星智能走进广汽研究院技术交流会圆满举行并落下帷幕。本次技术交流会得到广汽研究院相关部门的大力支持&#xff0c;并邀请到多名人员参与&#xff0c;涉及其技术、研发等部门。 本次活动的举办意义重大&#xff0c;目前广汽研究…

如何把A3 pdf 文章打印成A4

1. 用Adobe Acrobat 打开pdf 2 打印 选择海报 进行调整即可如下图,见下面红色的部分。

互联网医院源码搭建部署功能

互联网将医院与患者、医院内部&#xff08;医生、护士、领导层&#xff09;、医院与生态链上的各类组织机构连接起来。以患者为中心&#xff0c;优化医院业务流程&#xff0c;提升医疗服务质量与医院资源能效&#xff0c;让患者通过移动互联网随时随地的享受医院的服务&#xf…

练习八-利用有限状态机进行时序逻辑的设计

利用有限状态机进行时序逻辑的设计 1&#xff0c;任务目的&#xff1a;2&#xff0c;RTL代码&#xff0c;及原理框图3&#xff0c;测试代码&#xff0c;输出波形 1&#xff0c;任务目的&#xff1a; &#xff08;1&#xff09;掌握利用有限状态机实现一般时序逻辑分析的方法&am…

vue3中使用v-html解析后table表格的线不展示

在vue3中使用v-html展示富文本内容时&#xff0c;表格的框线不展示 在使用网上关于 ::v-deep /deep/ 各种用法之后&#xff0c;还是不生效 最后直接在scoped模式下的style&#xff0c;重新建一个&#xff0c;scoped模式会影响内部重新设置表格的样式

报名仅剩一周!课程直播和1V1指导助力文心一言插件开发赛事冲榜

百度联合CCF大数据与计算智能大赛发布文心一言插件设计与开发赛题&#xff0c;初赛倒计时最后一周&#xff01; 为了帮助各位选手完善插件功能设计&#xff0c;冲击更好名次&#xff0c;在11月23日24点前提交初赛作品的前20个队伍&#xff0c;可以获得1v1技术方案指导和百度精…

利用SVD对图像进行压缩

利用SVD对图像进行压缩 使用SVD能够对数据进行降维&#xff0c;对图像进行SVD&#xff0c;降维之后然后重构数据&#xff0c;还原后的图像就是压缩后的图像。 SVD SVD进行图像压缩所依据的数学原理就是矩阵的近似表示&#xff1a; A m n ≈ U m k ∑ k k V k n T A_{m\…

Java入门篇 之 内部类

本篇碎碎念&#xff1a;本篇没有碎碎念&#xff0c;想分享一段话&#xff1a; 你不笨&#xff0c;你只是需要时间&#xff0c;耐心就是智慧&#xff0c;不见得快就好&#xff0c;如果方向都不对&#xff0c;如果心术不正&#xff0c;如果德不配位&#xff0c;快就是对自己天分的…