Mysql之视图

Mysql之视图

  • 常见的数据库对象
  • 视图概述
    • 为什么使用视图
    • 视图的理解
    • 创建视图
      • 创建单表视图
        • 别名的运用
      • 创建多表联合视图
      • 利用视图对数据进行格式化
        • contact 函数
        • 以视图为基,再创建新的视图
    • 查看视图
    • 更新视图的数据
      • 一般情况
      • 不可更新的视图
    • 修改和删除视图
      • 修改视图
      • 删除视图
      • 注意点
    • 总结
      • 视图的优点

常见的数据库对象

在这里插入图片描述

视图概述

在这里插入图片描述

为什么使用视图

视图一方面可以帮我们使用表的一部分而不是所有的表,
另一方面也可以针对不同的用户制定不同的查询视图。

比如,针对一个公司的销售人员,我们只想给他看部分数据,而某些特殊的数据,比如采购的价格,则不会提供给他。
再比如,人员薪酬是个敏感的字段,那么只给某个级别以上的人员开放,其他人的查询视图中则不提供这个字段。

视图的理解

1.视图是一种 虚拟表 ,本身是 不具有数据 的,占用很少的内存空间,它是 SQL 中的一个重要概念。
2.视图建立在已有表的基础上, 视图赖以建立的这些表称为基表。
在这里插入图片描述

3.视图的创建和删除只影响视图本身,不影响对应的基表。但是当对视图中的数据进行增加、删除和修改操作时,数据表中的数据会相应地发生变化,反之亦然。

4.在数据库中,视图不会保存数据,数据真正保存在数据表中。当对视图中的数据进行增加、删除和修改操作时,数据表中的数据会相应地发生变化;反之亦然。

5.视图,是向用户提供基表数据的另一种表现形式
通常情况下,小型项目的数据库可以不使用视图,但是在大型项目中,以及数据表比较复杂的情况下,视图的价值就凸显出来了,它可以帮助我们把经常查询的结果集放到虚拟表中,提升使用效率。理解和使用起来都非常方便。

创建视图

#完整版
CREATE [OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW 视图名称 [(字段列表)]
AS 查询语句
[WITH [CASCADED|LOCAL] CHECK OPTION]#精简版
CREATE VIEW 视图名称
AS 查询语句

创建单表视图

案例

CREATE VIEW emp2
AS 
SELECT employee_id, last_name, salary
FROM employees
WHERE department_id = 80;SELECT *
FROM emp2

在这里插入图片描述

别名的运用

如果你想要取别名,视图表名字后面的字段与后面SELECT语句查询的字段的一一对应

视图表名字后面的字段就是原来字段的别名

下面是一个简单的案例

CREATE VIEW emp_year_salary (ename,year_salary)
AS
SELECT last_name,salary*12*(1+IFNULL(commission_pct,0))
FROM employees;;SELECT * 
FROM emp_year_salary

在这里插入图片描述

总结1:实际上就是我们在 SQL 查询语句的基础上封装了视图 VIEW,这样就会基于 SQL 语句的结果集形成一张虚拟表
总结2:在创建视图时,没有在视图名后面指定字段列表,则视图中字段列表默认和SELECT语句中的字段列表一致。如果SELECT语句中给字段取了别名,那么视图中的字段名和别名相同

创建多表联合视图

创建多表视图与创建单表视图的区别不大
使用多表连接就行
实现多表连接的方式有很多,这里随便选择了一种方式作为案例

CREATE VIEW dept_sum_vu
(name, minsal, maxsal, avgsal)
AS
SELECT d.department_name, MIN(e.salary), MAX(e.salary),AVG(e.salary)
FROM employees e, departments d
WHERE e.department_id = d.department_id
GROUP BY d.department_name;

在这里插入图片描述

利用视图对数据进行格式化

案例
我们经常需要输出某个格式的内容,比如我们想输出员工姓名和对应的部门名,对应格式为emp_name(department_name),就可以使用视图来完成数据格式化的操作:

不过要实现这种格式的话,我们需要借助contact函数来实现这一效果

contact 函数

作用**:将多个字符串连接起来,返回一个新的字符串**
如果要连接的字符串中为NULL,那么在新的字符串中将会以0的形式出现。
多个字符串之间,用逗号的形式,隔开

contact(str1, str2…)

CREATE VIEW emp_depart
AS
SELECT CONCAT(last_name,'(',department_name,')') AS emp_dept
FROM employees e JOIN departments d
WHERE e.department_id = d.department_idSELECT *
FROM emp_depart

在这里插入图片描述

以视图为基,再创建新的视图

当我们创建好一张视图之后,还可以在它的基础上继续创建视图
就是以视图为基表,再次创建新的视图

举例:联合“emp_dept”视图和“emp_year_salary”视图查询员工姓名、部门名称、年薪信息创建“emp_dept_ysalary”视图。

CREATE VIEW emp_dept_ysalary
AS
SELECT emp_dept.ename,dname,year_salary
FROM emp_dept INNER JOIN emp_year_salary
ON emp_dept.ename = emp_year_salary.ename;

查看视图

语法一: 查看数据库的表对象和视图对象

SHOW TABLES;
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/ce7d7517e2ef488a8fed5455eeae6540.png)> 语法二:查看视图的结构```sql
DESC / DESCRIBE 视图名称

语法三:查看视图的属性信息

#查看视图信息(显示数据表的存储引擎,版本,数据行数和数据大小)
SHOW TABLE STATUS LIKE '数据视图名称'\G

执行结果显示,注释Comment为VIEW,说明该表为视图
其他的信息为NULL,说明这是一个虚表。

语法四:查看视图的详细定义信息

SHOW CREATE VIEW 视图名称

案例

SHOW CREATE VIEW dept_sum_vu

在这里插入图片描述

更新视图的数据

一般情况

MySQL支持使用INSERT、UPDATE和DELETE语句对视图中的数据进行插入、更新和删除操作。
当视图中的数据发生变化时,数据表中的数据也会发生变化,反之亦然。

在这里插入图片描述

在这里插入图片描述在这里插入图片描述

不可更新的视图

要使视图可更新,视图中的行和底层基本表中的行之间必须存在 一对一 的关系
另外当视图定义出现如下情况时,视图不支持更新操作

  1. 在定义视图的时候指定了“ALGORITHM = TEMPTABLE”,视图将不支持INSERT和DELETE操作;
    2.视图中不包含基表中所有被定义为非空又未指定默认值的列,视图将不支持INSERT操作;
    3.在定义视图的SELECT语句中使用了 JOIN联合查询视图将不支持INSERT和DELETE操作
  1. 在定义视图的SELECT语句后的字段列表中使用了 数学表达式 或 子查询 ,视图将不支持INSERT,也不支持UPDATE使用了数学表达式、子查询的字段值;

修改和删除视图

修改视图

方法一:通过CREATE OR REPLACE VIEW 语句进行修改

CREATE OR REPLACE VIEW empvu80
(id_number, name, sal, department_id)
AS
SELECT employee_id, first_name || ' ' || last_name, salary, department_id
FROM employees
WHERE department_id = 80;

说明:CREATE VIEW 子句中各列的别名应和子查询中各列相对应。

方法二:通过ALTER VIEW 语句进行修改

ALTER VIEW 视图名称
AS 
查询语句

删除视图

这里必须要深刻理解删除视图的概念,删除视图
只是删除视图的定义,而不会删除基表的数据

DROP VIEW IF EXISTS 视图名称

特别注意:如果是基于视图创建新的视图的情况
例如:基于视图a 创建了视图b,那么如果你删除了视图a,必定会导致视图b的查询失败,此时应该要对视图b进行修改或者删除

注意点

视图的数据更新是有可能失败的
毕竟视图并不是专门用来进行数据更新操作的,只是方便人来看和分析
所以对数据进行更新,还是在基表上进行比较合适

总结

视图的优点

1… 操作简单
将经常使用的查询操作定义为视图,可以使开发人员不需要关心视图对应的数据表的结构、表与表之间的关联关系,也不需要关心数据表之间的业务逻辑和查询条件,而只需要简单地操作视图即可,极大简化了开发人员对数据库的操作。

2.减少数据冗余
视图跟实际数据表不一样,它存储的是查询语句。所以,在使用的时候,我们要通过定义视图的查询语句来获取结果集。而视图本身不存储数据,不占用数据存储的资源,减少了数据冗余。

3.数据安全
MySQL将用户对数据的 访问限制 在某些数据的结果集上,而这些数据的结果集可以使用视图来实现。用户不必直接查询或操作数据表。这也可以理解为视图具有 隔离性 。视图相当于在用户和实际的数据表之间加了一层虚拟表。

在这里插入图片描述

同时,MySQL可以根据权限将用户对数据的访问限制在某些视图上,用户不需要查询数据表,可以直接通过视图获取数据表中的信息。这在一定程度上保障了数据表中数据的安全性。

4.适应灵活多变的需求 当业务系统的需求发生变化后,如果需要改动数据表的结构,则工作量相对较大,可以使用视图来减少改动的工作量。这种方式在实际工作中使用得比较多。

5.如果我们在实际数据表的基础上创建了视图,那么,如果实际数据表的结构变更了,我们就需要及时对相关的视图进行相应的维护。特别是嵌套的视图(就是在视图的基础上创建视图),维护会变得比较复杂, 可读性不好 ,容易变成系统的潜在隐患。因为创建视图的 SQL 查询可能会对字段重命名,也可能包含复杂的逻辑,这些都会增加维护的成本。
实际项目中,如果视图过多,会导致数据库维护成本的问题。
所以,在创建视图的时候,你要结合实际项目需求,综合考虑视图的优点和不足,这样才能正确使用视图,使系统整体达到最优

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

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

相关文章

【C#】Visual Studio 2022 远程调试配置教程

在某些特殊的情况下,开发机和调试机可能不是同一台设备,此时就需要远程调试了。 开发机配置 首先需要确保两台机器在同一局域网下。 创建共享文件夹 随便找个地方新建一个文件夹,用来放编译结果。例如我这里是 D:\DebuggingWorkspace\。 …

什么是阿里云负载均衡SLB?

目录 硬件或软件负载均衡的区别是什么? 什么是阿里云负载均衡SLB? 阿里云传统型负载均衡CLB 硬件或软件负载均衡的区别是什么? 通过专用硬件实现负载均衡,那么整体成本会较高,而且设备容易出现单点故障,…

【MySQL】InnoDB和MyISAM区别

文章目录 一、索引不同1 InnoDB聚簇索引,MyISAM非聚簇索引1 InnoDB聚簇索引2 MyISAM非聚簇索引 2 InnoDB必须要有主键,MyISAM允许没有主键3 InnoDB支持外键4 InnoDB不支持全文索引5 索引保存位置不同 二、对事物的支持三、存储结构不同四、存储空间不同五…

Elasticsearch中复制一个索引数据到新的索引中

问题 我有时候,需要调试一个已经存在的ES索引,需要从已有的索引复制数据到新的索引中去。 解决 这里我借助一个GUI工具,来解决这个问题,底层它是使用Reindex的API实现索引数据复制的。 步骤 选中已存在的redix菜单&#xff0…

00-Git 应用

Git 应用 一、Git概述 1.1 什么是Git git 是一个代码协同管理工具,也称之为代码版本控制工具,代码版本控制或管理的工具用的最多的: svn、 git。 SVN 是采用的 同步机制,即本地的代码版本和服务器的版本保持一致(提…

KEPServerEX 6 之【外篇-1】PTC-ThingWorx服务端软件安装 Tomcat10本地安装

本文目标: 安装 Java 和 Apache Tomcat ,为ThingWorx安装做基础。 ----------------------------------------------------------------------- 安装重点 --------------------------------------------------------------------- 1. 安装 Java 11 / JDK 11 添加系…

SSRF中Redis的利用

目录 1. SSRF 1.1 什么是SSRF 1.2 漏洞成因 1.3 可能会存在SSRF的地方 1.4 SSRF分类 1.5 验证方法 1.6 利用方式 1.7 可以利用的协议 1.8 SSRF过滤绕过 2. SSRF攻击Redis 2.1 环境搭建 2.2 漏洞复现(通过ssrf利用redis写入webshell) 2.2.1 想要写入webshell的两个…

【unity学习笔记】4.场景切换

创建空物体→创建脚本挂载在空物体上→打开脚本 1.创建所需要的场景 assets中点击创建场景 2.文件→生成设置 3.将需要的场景拖入 4.场景跳转 创建空对象,将脚本放在空对象上。 注意两个类:场景类、场景管理类 void Start(){//场景跳转SceneManager.Lo…

labelme目标检测数据类型转换

1. labelme数据类型 LabelMe是一个开源的在线图像标注工具,旨在帮助用户创建和标记图像数据集。它提供了一个用户友好的界面,让用户可以直观地在图像上绘制标记框、多边形、线条等,以标识和注释图像中的对象或区域。 GitHub:http…

智能监控平台/视频共享融合系统EasyCVR海康设备国标GB28181接入流程

TSINGSEE青犀视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&…

C# 使用Pipelines处理Socket数据包

写在前面 在上一篇中对Pipelines进行简单的了解,同时也留下了未解的问题,如何将Pipelines类库运用到Socket通讯过程中来解决粘包和分包。链接地址如下: 初识System.IO.Pipelines https://rjcql.blog.csdn.net/article/details/135211047 这…

Hive安装笔记——备赛笔记——2024全国职业院校技能大赛“大数据应用开发”赛项——任务2:离线数据处理

将下发的ds_db01.sql数据库文件放置mysql中 12、编写Scala代码,使用Spark将MySQL的ds_db01库中表user_info的全量数据抽取到Hive的ods库中表user_info。字段名称、类型不变,同时添加静态分区,分区字段为etl_date,类型为String&am…

前端开发之通过vue-office组件实现文件预览

前端开发之通过vue-office组件实现文件预览 前言效果图docx文件xlsx文件pdf文件 vue中简单案例1、安装组件2、vue中代码 前言 在实现文件预览的时候我们可以通过vue-office组件来实现文件的预览效果 效果图 docx文件 xlsx文件 pdf文件 vue中简单案例 1、安装组件 整体安装…

RabbitMQ入门指南(九):消费者可靠性

专栏导航 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、消费者确认机制 二、失败重试机制 三、失败处理策略 四、业务幂等性 1.通过唯一标识符保证操作的幂等性 2.通过业务判断保证操作的幂等性 总结 前言 RabbitMQ是一个高效、可靠的开源消息队列系…

词表示:语言与计算的桥梁

目录 前言1 什么是词表示2 独热表示3 上下文表示4 分布式表示结语 前言 在自然语言处理领域,词语的表示是一个基本挑战。将词语转换为计算机可以理解的符号,衡量词语之间的相似度,捕捉它们之间复杂的关系,是使机器能够理解和处理…

Bluetooth Mesh 入门学习干货,参考Nordic资料(更新中)

蓝牙网状网络(Bluetooth mesh)概念 概述 蓝牙Mesh Profile | Bluetooth Technology Website规范(Mesh v1.1 后改名Mesh ProtocolMesh Protocol | Bluetooth Technology WebsiteMesh Protocol)是由蓝牙技术联盟(Bluetooth SIG)开…

EasyExcel实现动态表头(注解实现)

要实现上述动态头,按每日统计,每月统计,每年统计。而时间是一直变化,所以我们需要表头也一直动态生成。 首先,我们需要定义所需要实体类 public class CountDayData {ExcelProperty(value "业务员姓名")p…

css 设置字体渐变色和阴影

一、需求 我们平时写样式的时候可能遇到需要将字体设置成渐变色,这样能使界面整体美化提升,那么css怎么去实现这个功能呢?下面我介绍一种常用的方法,欢迎大家补充 二、渐变实现 先看效果图: 直接上代码: /…

Seem环境安装

创建虚拟环境 conda create -n seem python3.8 conda activate seem 安装相关依赖:(不按照的话会报错) sudo apt-get install openmpi-bin libopenmpi-devconda install gcc_linux-64pip install mpi4py 导入环境 export PYTHONPATH$(pwd…

开发效率之把握需求、减少返工

前言 当年初入软件开发行业的我,拿到需求就莽,要设计没设计,要分析没分析,结果就是没理清楚需求,致使频频返工。 需求没理解对,做得再多再好也白搭。 估算需求把握程度 假如每个IF分支的“是”加一分&…