为什么要用数据库视图?

news2024/11/15 9:37:43

视图的定义

视图(View)是一种虚拟的表,其结构和数据来自于一个或多个基本表,可以被当作普通表一样进行查询操作,但实际上不存储任何数据。在数据库中,视图可以被看作是一种数据访问的方式,它可以隐藏底层表的复杂性,提供简洁易懂的数据访问接口,方便用户进行查询、分析和报表等操作。

视图的作用

视图的作用主要有以下几个方面:

  1. 简化查询操作:通过创建视图,可以将多个表的数据组合成一个逻辑上的整体,减少了用户在查询时需要编写复杂的 SQL 语句。
  2. 隐藏复杂性:数据库中有时候存在多个关联表,为了查询这些表的数据需要编写复杂的 SQL 语句,使用视图可以将这些关联表的查询逻辑隐藏起来,简化了用户对数据库的操作。
  3. 提高数据安全性:视图可以对底层表进行过滤和限制访问,可以对用户提供必要的访问权限,可以保护数据的隐私和安全。
  4. 减少数据冗余:有时候需要将数据多次查询,这样容易导致数据冗余,使用视图可以避免这种情况的发生,同时可以减少网络流量和提高数据访问效率。

举例说明

这里给你举一个具体的例子,假设我们有一个电子商务网站,有以下两个表:

  • 商品表:包含商品ID、名称、价格等信息;
  • 订单表:包含订单ID、购买者ID、购买时间等信息。

现在我们需要查询用户最近购买的商品名称和价格,如果不使用视图,可能需要编写如下的 SQL 语句:

1676880026765.jpg

上述 SQL 语句涉及两个表的联合查询、排序和限制,对于一些不熟悉 SQL 的用户来说,可能很难理解。但是,如果我们创建一个名为“recent_orders”的视图,用于展示最近订单的详细信息,查询用户最近购买的商品名称和价格,就变得非常简单了:

image.png

上述 SQL 语句非常简单,只需要查询“recent_orders”视图即可,无需关心视图背后的复杂查询逻辑,这样就可以提高代码的可读性和维护性。另外,视图还可以对底层表进行过滤和限制访问,可以保护数据的隐私和安全,对于电商网站这种需要保护用户隐私的应用来说,非常重要.

创建视图

下面以上面提到的例子为例,创建一个名为“recent_orders”的视图,代码如下:

image.png

上述代码创建了一个名为“recent_orders”的视图,其查询逻辑为:查询“goods”表和“order_details”表,返回商品名称、价格、购买者ID和购买时间等信息。通过创建这个视图,我们可以方便地查询用户最近购买的商品名称和价格,而不需要编写复杂的 SQL 语句。

需要注意的是,视图只是一个虚拟表,不存储任何数据,其查询结果实际上是通过查询底层表获得的。因此,在创建视图时需要确保底层表的结构和数据都是正确的,否则查询结果可能会出现问题。此外,由于视图是基于底层表的查询逻辑生成的,其性能可能会受到底层表的影响,因此在创建视图时需要仔细考虑其查询效率和性能影响。

为什么说创建视图查询会提高查询性能?

如果将上面这个例子改成一个需要联表查询的视图,那么使用视图的优势就会更加明显。例如,我们可以创建一个名为“recent_orders_with_goods”的视图,其查询逻辑为:查询最近订单的详细信息,并联合查询对应的商品信息。这样,我们就可以在一个简单的查询语句中获得最近订单和对应的商品信息,而无需编写复杂的 SQL 语句。示例代码如下:

image.png

在查询“recent_orders_with_goods”视图时,只需要编写一个简单的 SQL 查询语句,就可以获取最近订单和对应的商品信息:

image.png

对于这种需要联表查询的场景,使用视图的优势就体现出来了。通过将多个表的关联逻辑封装到一个视图中,我们可以简化查询语句,并提高查询效率。视图还可以通过使用索引、分区等技术进一步优化查询效率,因此对于复杂的查询场景,使用视图是非常有益的。

具体说下视图为什么可以提高查询效率?

当我们使用视图查询时,数据库系统会先将视图的查询逻辑转换为底层表的查询逻辑,然后再执行查询。这样,我们就可以在查询时使用已经优化过的查询逻辑,而无需重复编写和优化查询逻辑,从而提高查询效率。

此外,使用视图还可以通过使用索引、分区等技术进一步优化查询效率。例如,我们可以在视图中使用索引来加速查询,或者将视图分区以提高查询效率。这些优化措施可以提高查询效率,并且不会对代码的可读性和维护性造成太大的影响。

视图的更新及维护

当视图需要更新时,通常有以下情况:

  1. 视图查询语句需要更新:视图的定义是基于查询语句构建的,如果查询语句需要修改,那么视图的定义也需要更新。
  2. 表结构变化:当视图所基于的表结构发生变化时,例如新增、删除、修改列,需要更新视图定义。
  3. 数据变化:当视图所基于的数据发生变化时,例如数据被删除、修改、新增,需要更新视图定义。

在 SQL 中,使用 CREATE VIEW 语句可以创建一个视图。如果视图已经存在,使用 CREATE VIEW 语句会导致一个错误。为了避免这种情况,可以使用 OR REPLACE 关键字。

OR REPLACE 关键字的作用是:如果视图已经存在,那么会用新的定义来替换原有的视图;如果视图不存在,那么就创建一个新的视图。

下面是一个使用 OR REPLACE 关键字更新视图的示例 SQL 语句:

image.png

在这个例子中,如果 my_view 已经存在,那么该语句将使用新的 SELECT 语句来替换原有的视图定义;如果 my_view 不存在,那么该语句将创建一个新的视图。

更多分享在微信公众号:老程序员刘飞

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

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

相关文章

16.hadoop系列之MapReduce之MapTask与ReduceTask及Shuffle工作机制

1.MapTask工作机制 以上内容我们之前文章或多或少介绍过,就已网络上比较流行的该图进行理解学习吧 MapTask分为五大阶段 Read阶段Map阶段Collect阶段溢写阶段Merge阶段 2.ReduceTask工作机制 ReduceTask分为三大阶段 Copy阶段Sort阶段Reduce阶段 3.ReduceTask并…

eBPF双子座:天使or恶魔?

启示录 新约圣经启示录认为:恶魔其实本身是天使,但炽天使长路西法背叛了天堂,翅膀变成了黑色,坠落地狱,堕落成为恶魔。这些恶魔主宰著黑暗势力,阻碍人类与上帝沟通,无所不用其极。所以可以说天…

box-shadow详解

box-shadow详解 属性定义及使用说明 box-shadow属性可以设置一个或多个下拉阴影的框。 语法 box-shadow: h-shadow v-shadow blur spread color inset;注意:boxShadow 属性把一个或多个下拉阴影添加到框上。该属性是一个用逗号分隔阴影的列表,每个阴…

使用多种算法对sin函数进行拟合-学习记录

1.使用linear层拟合 原代码链接在这里,效果如下: 2.使用LSTM预测 原代码链接在这里,效果如下: 3.使用GAN拟合 忘记代码哪里找的了,不过效果很差。 4.使用LSTM-GAN 这个代码在GitHub上找的,然后改了改&…

3、内存管理

文章目录1、内存的基础知识1.1、什么是内存?1.2、进程的运行原理--指令1.3、逻辑地址 & 物理地址1.4、从写程序到程序运行1.5、装入模块到运行1.6、装入的三种方式--绝对装入1.7、装入的三种方式--静态重定位1.8、装入的三种方式--动态重定位(重定位…

移动WEB开发四、rem布局

零、文章目录 文章地址 个人博客-CSDN地址:https://blog.csdn.net/liyou123456789个人博客-GiteePages:https://bluecusliyou.gitee.io/techlearn 代码仓库地址 Gitee:https://gitee.com/bluecusliyou/TechLearnGithub:https:…

树的概念及结构

前言 什们是树?树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。树 (1)树的特点 有一个特殊的…

Blazor入门100天 : 身份验证和授权 (3) - DB改Sqlite

目录 建立默认带身份验证 Blazor 程序角色/组件/特性/过程逻辑DB 改 Sqlite将自定义字段添加到用户表脚手架拉取IDS文件,本地化资源freesql 生成实体类,freesql 管理ids数据表初始化 Roles,freesql 外键 > 导航属性完善 freesql 和 bb 特性 本节源码 https://github.com/…

采用aar方式将react-native集成到已有安卓APP

关于react-native和android的开发环境搭建、环境变量配置等可以查看官方文档。 官方文档地址 文章中涉及的node、react等版本: node:v16.18.1 react:^18.1.0 react-native:^0.70.6 gradle:gradle-7.2开发工具:VSCode和android studio 关于react-native和…

即拼商城系统之七人拼团会员模式

即拼商城系统之七人拼团会员模式,在商城选购399商品可加入会员体系,参加7人拼团盈利。购买产品或礼包成为团长,铺满剩余6个位置拼团成功。满团后即可用赚来的钱去复购礼包再次开团,继续盈利。 ◇◆商城系统团长获得礼包提成&#…

【matplotlib】可视化解决方案——如何向图表中添加数据表

概述 虽然 matplotlib 主要用途是绘图,但是他还是可以在绘图时帮助我们做一些其他事务,比如在图表旁边放置一个整齐的数据表格。我们必须明白为数据绘制可视化图形主主要是是为了解释那些不能理解的数据。将一些来自数据整体集合的总结性或者突出强调的…

大地量子全面使用亚马逊云科技提供的多样化云服务

近年来,我国光伏和风电并网装机容量持续增长,截至2021年底,全国可再生能源装机规模突破10亿千瓦,占总发电装机容量的44.8%。其中,风电装机3.28亿千瓦、光伏发电装机3.06亿千瓦。风光电总装机和新增装机规模多年来位居全…

PCB设计中降低噪声与电磁干扰的24个窍门

电子设备的灵敏度越来越高,这要求设备的抗干扰能力也越来越强,因此PCB设计也变得更加困难,如何提高PCB的抗干扰能力成为众多工程师们关注的重点问题之一。本文将介绍PCB设计中降低噪声与电磁干扰的一些小窍门。 下面是经过多年设计总结出来的…

MyBaits

MyBaitsMyBaits的jar包介绍MyBaits的入门案例创建实体java日志处理框架常用的日志处理框架Log4j的日志级别Mybatis配置的完善Mybatis的日志管理使用别名alias方式一方式二SqlSession对象下的常用API查询操作Mapper动态代理Mapper 动态代理规范查询所有用户根据用户ID查询用户Ma…

MMPBSA计算--基于李继存老师gmx_mmpbsa脚本

MMPBSA计算–基于李继存老师gmx_mmpbsa脚本 前期准备 软件安装 安装gromacs, 可以查阅 我的blogGromacs-2022 GPU-CUDA加速版 unbantu 安装 apbs, sudo apt install apbs 安装 gawk, sudo apt install gawk MD模拟好的文件 我们以研究蛋白小分子动态相互作用-III(蛋白配体…

钓鱼网站+bypassuac提权

本实验实现1 :要生成一个钓鱼网址链接,诱导用户点击,实验过程是让win7去点击这个钓鱼网站链接,则会自动打开一个文件共享服务器的文件夹,在这个文件夹里面会有两个文件,当用户分别点击执行后,则…

【面试题】vue中的插槽是什么?

大厂面试题分享 面试题库后端面试题库 (面试必备) 推荐:★★★★★地址:前端面试题库一、slot是什么在HTML中 slot 元素 ,作为 Web Components 技术套件的一部分,是Web组件内的一个占位符该占位符可以在后期…

Docker----------day3

常规安装大体步骤 1.安装tomcat 1.查找tomcat docker search tomcat2.拉取tomcat docker pull tomcat3.docker images查看是否有拉取到的tomcat 4.使用tomcat镜像创建容器实例(也叫运行镜像) docker run -it -p 8080:8080 tomcat5.新版tomcat把webapps.dist目录换成webapp…

100种思维模型之九屏幕分析思维模型-016

一、认识九屏幕分析思维模型 1.九屏幕分析思维模型定义 九屏幕法是TRIZ理论中的创新思维方法五大方法之一。它是把问题当成一个系统来研究, 关注系统的整体性、 层级性、目的性,即各要素之间的结构。 九屏幕法是按照时间和系统层次两个维度进行思考。 包…

MAC中docker搭建fastdfs

1:首先搭建Docker2:通过Docker搭建fastdfs(1)查找镜像打开终端通命令查找fastdfs的镜像docker search fastdfs(二)拉取镜像在找到合适的镜像后执行命令:docker pull delron/fastdfs(三) 创建storage和track…