【Mysql专题】视图介绍及其基本操作

前言

前段时间,跟客户开个线上会议,在和对方技术人员讨论到如何把数据给我们的时候,对方说【丢给你们一个视图,你们查视图就好了】我一下子懵了。当时现场贼尴尬,我只能假装断线了,然后又模棱两可的说了几句,勉强把场子圆回来了。
话说回来,楼主虽然敲代码敲了很多年了,但是基本上没碰过多少sql。因为以前是游戏行业,管理后台基本上都是专门的人写的,我只是写游戏业务内容的。
想着以后避免再次遇到这种尴尬的场景,还是稍微花点时间学习一下【视图】这个东西吧。

一、视图的介绍

1. 什么是视图

视图是一个虚拟表,其内容由查询定义。同真实表一样,视图包含一系列带有名称的列和行数据,但视图并不是数据库真实存储的数据表。
视图是从一个、多个表,或者其他视图中导出的表,包含一系列带有名称的数据列和若干条数据行。
它跟真实的数据库表有如下区别:

  • 视图不是真实存在的表,而是一张虚拟表。其结构和数据都是建立在对数据库中,真实表的查询基础上的
  • 存储在数据库中的查询操作 SQL 语句定义了视图的内容,列数据和行数据来自于视图查询所引用的实际表,引用视图时动态生成这些数据(PS:这意味着,其实每次查询视图时,其实就是做一次当初定义视图时引用的操作)
  • 视图没有实际的物理记录,不是以数据集的形式存储在数据库中的,它所对应的数据实际上是存储在视图所引用的真实表中的
  • 视图是数据的窗口,而表是内容。表是实际数据的存放单位,而视图只是以不同的显示方式展示数据,其数据来源还是实际表
  • 视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些 SQL 语句的集合。从安全的角度来看,视图的数据安全性更高,使用视图的用户不接触数据表,不知道表结构(PS:所以这里可以看出来了,为什么当时客户跟我说要丢个视图给我,其实就是懒得写接口,但是又出于保护自己数据库表的目的,所以要特意编写个视图给我们)
  • 视图的建立和删除只影响视图本身,不影响对应的基本表

2. 视图的作用

通过上面的基本介绍,我估计大家对视图应该有关大概的印象了。当然,想要更具体的了解,还要结合下面的【视图的基本操作】,这个我们后面再继续说。
那视图有什么作用呢?我们这里先大概写一下,现在不理解也无所谓,看了后面的【视图的基本操作】你肯定能了解了。
作用如下:

  1. 定制用户数据,聚焦特定的数据。在实际的应用场景中,不同的用户或者接口对不同的数据有不同的需求。
    例如:数据库有公司表(公司id,公司名),部门表(部门id,部门名字),员工表(工号,员工姓名)同时存在。我们想要直接明了地查看,某个员工是属于哪个分公司,哪个部门的,就需要联合三张表进行查询。这时,我们就可以定义一个视图联合查询这三个部门的,并且无需关心公司id部门id那些冗余字段
  2. 简化数据库操作。在使用查询时,很多时候要使用聚合函数,同时还要显示其他字段的信息,可能还需要关联到其他表,语句可能会很长,如果这个动作频繁发生的话,可以创建视图来简化操作(看吧,其实数据库视图没什么神奇的,就是做这些事情而已)
  3. 提高基表数据的安全性。视图是虚拟的,物理上是不存在的。可以只授予用户视图的权限,而不具体指定使用表的权限,来保护基础数据的安全
  4. 共享所需数据。通过使用视图,每个用户不必都定义和存储自己所需的数据,可以共享数据库中的数据,同样的数据只需要存储一次
  5. 更改数据格式。通过使用视图,可以重新格式化检索出的数据,并组织输出到其他应用程序中
  6. 重用 SQL 语句视图提供的是对查询操作的封装,本身不包含数据,所呈现的数据是根据视图定义从基础表中检索出来的,如果基础表的数据新增或删除,视图呈现的也是更新后的数据。视图定义后,编写完所需的查询,可以方便地重用该视图

不过使用视图的时候,还应该注意以下几点:

  • 创建视图需要足够的访问权限
  • 创建视图的数目没有限制
  • 视图可以嵌套,即从其他视图中检索数据的查询来创建视图
  • 视图不能索引,也不能有关联的触发器、默认值或规则
  • 视图可以和表一起使用
  • 视图不包含数据,所以每次使用视图时,都必须执行查询中所需的任何一个检索操作。如果用多个连接和过滤条件创建了复杂的视图或嵌套了视图,可能会发现系统运行性能下降得十分严重。因此,在部署大量视图应用时,应该进行系统测试

二、视图的基本操作

我这边直接拿我们生产环境的表来做实验了。不过这边都是简单操作,更具体的东西还需要大家自己去了解。其实视图的操作,基本上跟表操作没啥两样,都是增删查改。
这边用到了3张表做基本操作演示,分别为:餐厅表(kitchen_canteen)、档口表(kitchen_stall)、经营报表(unify_report_stall)。具体表的定义我这边就不给了,我相信大家看了下面的sql代码基本也知道我想要干啥。

2.1 创建视图

语法格式如下:

CREATE VIEW <视图名> AS <SELECT语句>

示例:

CREATE VIEW view_canteen_store_turnover AS
SELECTkc.name AS canteenName,ks.name AS stallName,urs.biz_date AS bizDate,urs.turnover
FROMunify_report_stall urs
INNER JOIN kitchen_canteen kc ON urs.store_id = kc.id
INNER JOIN kitchen_stall ks ON urs.line_id = ks.id;

解析:我这边就是连了最开始说的3张表,获取餐厅名字,档口名字,以及档口营业额,组合成一个【商家营业额】视图。后续,我们就可以对这个视图直接做查询操作了,效果等同于上述的select查询片段。

2.2 查询视图

查询上面的视图,跟普通查询是一样的,为了证明,我们用explain给大家看看。首先先看select的结果:

SELECT * FROM view_canteen_store_turnover;

在这里插入图片描述
看explain的结果:
在这里插入图片描述
在这里插入图片描述
看,explain的结果是一样的。

2.3 修改视图

语法格式如下:

ALTER VIEW <视图名> AS <SELECT语句>

其实也可以不修改的,先删除,再重新创建也是一样道理。

2.4 删除视图

语法格式如下:

DROP VIEW <视图名> [ , <视图名2>]

PS:一次性可以删除多个视图

感谢

感谢小白教程的《Mysql教程》

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

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

相关文章

【网络安全---ICMP报文分析】Wireshark教程----Wireshark 分析ICMP报文数据试验

一&#xff0c;试验环境搭建 1-1 试验环境示例图 1-2 环境准备 两台kali主机&#xff08;虚拟机&#xff09; kali2022 192.168.220.129/24 kali2022 192.168.220.3/27 1-2-1 网关配置&#xff1a; 编辑-------- 虚拟网路编辑器 更改设置进来以后 &#xff0c;先选择N…

10.1 调试事件读取寄存器

当读者需要获取到特定进程内的寄存器信息时&#xff0c;则需要在上述代码中进行完善&#xff0c;首先需要编写CREATE_PROCESS_DEBUG_EVENT事件&#xff0c;程序被首次加载进入内存时会被触发此事件&#xff0c;在该事件内首先我们通过lpStartAddress属性获取到当前程序的入口地…

阿里云免费服务器无法领取限制说明

阿里云提供免费服务器供用户申请&#xff0c;但是领取免费服务器是有条件的&#xff0c;并不是有所的阿里云用户均可领取免费云服务器&#xff0c;免费服务器领取条件为&#xff1a;账号从未使用过阿里云服务器的用户&#xff0c;阿里云百科来举例说明免费服务器领取说明&#…

STM32复习笔记(六):STM32远程升级BootLoader相关

目录 Preface&#xff1a; &#xff08;一&#xff09;STM32上电启动流程 &#xff08;二&#xff09;BootLoader相关 &#xff08;三&#xff09;Clion配置 Preface&#xff1a; 有关STM32的BootLoader主要还是参考了许多大佬的文章&#xff0c;这里只是简单地列举一下&am…

基于SpringBoot的体育馆场地赛事预约管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

【C++】基础入门

万字复习C基础入门语法&#xff0c;适合学过C的朋友用来复习查阅&#xff0c;可能不太适合0基础的朋友。 一.c初识 (1) 第一个c程序 最简单的格式&#xff1a; // 导入头文件 #include<iostream> // 简化对命名空间std下函数和对象的使用 using namespace std; // …

Java基于SSM的校园一卡通系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

go语法入门2

字符串 使用双引号或反引号引起来的任意个字符。它是字面常量。 func main() {var a "abc\n测试" // \n换行fmt.Println(a) } abc 测试func main() {var a "abc\n\t测试" \\换行后在tabfmt.Println(a) } abc测试func main() {var a abc测试 …

好奇喵 | Surface Web ---> Deep Web ---> Dark Web

前言 我们可能听说过深网(deep Web)、暗网(dark Web)等名词&#xff0c;有些时候可能会认为它们是一个东西&#xff0c;其实不然&#xff0c;两者的区别还是比较大的。 什么是deep web&#xff1f; 深网是网络的一部分&#xff0c;与之相对应的是表层网络&#xff08;surface …

SketchUp Pro 2023 for Mac——打造你的创意之城

SketchUp Pro 2023 for Mac是一款专业级的3D建模软件&#xff0c;为你提供最佳的设计和创意工具。不论你是建筑师、室内设计师&#xff0c;还是爱好者&#xff0c;SketchUp Pro都能满足你对于创意表达的需求。 SketchUp Pro 2023拥有强大而直观的界面&#xff0c;让你轻松绘制…

C++入门-day01

一、认识C C融合了三种不同的编程方式 C代表的过程性语言在C基础上添加的类、结构体puls代表的面向对象语言C模板支持泛型编程 C完全兼容C的特性 Tips&#xff1a;侯捷老师提倡的Modren C是指C11、C14、C17和C20这些新标准所引入的一系列新特性和改进。在我们练习的时候也应当去…

PG 多表连接查询

写法&#xff1a; 使用 select 表名.键名 from 表1 join表2 on 相同的主键 构造出来一张新表 多表要用表名.键名 才能知道是哪一张表 传统写法也行 类型&#xff1a; 内 而外的要这样写

复习C语言数组的用法

实验内容 1.1设计一个函数fun&#xff0c;功能是有N*N的矩阵&#xff0c;根据给定的m值&#xff0c;m<N,将每行元素中的值&#xff0c;均往右移m个位置&#xff0c;左边置0 #include<stdio.h> void fun(int (*a)[3],int m){int n,j,i,k,num;int p2;//右移位置列数nu…

Debezium日常分享系列之:使用数据库中的数据流进行在线机器学习

Debezium日常分享系列之&#xff1a;使用数据库中的数据流进行在线机器学习 一、背景介绍二、数据集准备三、使用 Apache Flink 进行分类四、使用 Debezium 和 Kafka 作为源数据流五、构建 Flink 流 k-means六、评估模型七、使用 Apache Spark 进行分类八、定义数据流九、定义和…

Qt+openCV学习笔记(十六)Qt6.6.0rc+openCV4.8.1+emsdk3.1.37编译静态库

前言&#xff1a; 有段时间没来写文章了&#xff0c;趁编译库的空闲&#xff0c;再写一篇记录文档 WebAssembly的发展逐渐成熟&#xff0c;即便不了解相关技术&#xff0c;web前端也在不经意中使用了相关技术的库&#xff0c;本篇文档记录下如何编译WebAssembly版本的openCV&…

Allegro174版本如何关闭模块复用后铜皮自动从动态变成静态操作指导

Allegro174版本如何关闭模块复用后铜皮自动从动态变成静态操作指导 在用Allegro进行PCB设计的时候,模块复用是使用的十分频繁的操作,当Allegro升级到了174 S034版本的时候,当使用模块复用的功能的时候,模块内的铜皮会自动动静转换,大部分情况是不需要的。 如下图 如何关闭…

力扣 -- 377. 组合总和 Ⅳ

解题步骤&#xff1a; 参考代码&#xff1a; class Solution { public:int combinationSum4(vector<int>& nums, int target) {int nnums.size();vector<double> dp(target1);//初始化dp[0]1;//填表for(int i1;i<target;i){for(int j0;j<n;j){//填表if(…

基于郊狼优化的BP神经网络(分类应用) - 附代码

基于郊狼优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于郊狼优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.郊狼优化BP神经网络3.1 BP神经网络参数设置3.2 郊狼算法应用 4.测试结果&#xff1a;5.M…

力扣-350.两个数组的交集||

Idea 首先遍历第一个数组&#xff0c;用哈希表存储每个数字及其出现的次数。 然后遍历第二个数组&#xff0c;每出现重复的数字&#xff0c;并判断该数字在哈希表的次数是不是大于0&#xff0c;如果大于则存入答案数组&#xff0c;并将哈希表次数减1&#xff0c;直接遍历结束。…

剑指offer——JZ18 删除链表的节点 解题思路与具体代码【C++】

一、题目描述与要求 删除链表的节点_牛客题霸_牛客网 (nowcoder.com) 题目描述 给定单向链表的头指针和一个要删除的节点的值&#xff0c;定义一个函数删除该节点。返回删除后的链表的头节点。 1.此题对比原题有改动 2.题目保证链表中节点的值互不相同 3.该题只会输出返回…