【MySQL】View 视图用法及作用

news2024/11/8 7:39:06

文章目录

  • 1. 视图概述
    • 1.1 为什么使用视图?
    • 1.2 视图的理解
  • 2. 创建视图
    • 2.1 创建单表视图
    • 2.2 创建多表联合视图
    • 2.3 基于视图创建视图
  • 3. 查看视图
  • 4. 更新视图的数据
    • 4.1 一般情况
    • 4.2 不可更新的视图
  • 5. 删除视图
  • 6. 总结
    • 6.1 视图优点
    • 6.2 视图缺点


在这里插入图片描述

在这里插入图片描述


1. 视图概述


1.1 为什么使用视图?


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


1.2 视图的理解


视图是一种 虚拟表 ,本身是不具有数据的,占用很少的内存空间,它是 SQL 中的一个重要概念。

视图建立在已有表的基础上, 视图赖以建立的这些表称为基表
在这里插入图片描述


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


2. 创建视图


2.1 创建单表视图

举例

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

查询视图

SELECT *
FROM salvu80;

举例

CREATE VIEW salvu50
AS
SELECT employee_id ID_NUMBER, last_name NAME,salary*12 ANN_SALARY
FROM employees
WHERE department_id = 50;

说明1:实际上就是我们在 SQL 查询语句的基础上封装了视图 VIEW,这样就会基于 SQL 语句的结果集
形成一张虚拟表。

说明2:在创建视图时,没有在视图名后面指定字段列表,则视图中字段列表默认和SELECT语句中的字
段列表一致。如果SELECT语句中给字段取了别名,那么视图中的字段名和别名相同。

2.2 创建多表联合视图


举例

CREATE VIEW empview
AS
SELECT employee_id emp_id,last_name NAME,department_name
FROM employees e,departments d
WHERE e.department_id = d.department_id;
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;

2.3 基于视图创建视图


当我们创建好一张视图之后,还可以在它的基础上继续创建视图。

举例:联合“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;

3. 查看视图


语法1:查看数据库的表对象、视图对象

SHOW TABLES;

语法2:查看视图的结构

DESC / DESCRIBE 视图名称;

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

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

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

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

SHOW CREATE VIEW 视图名称;

4. 更新视图的数据


4.1 一般情况

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


4.2 不可更新的视图

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

  • 在定义视图的时候指定了“ALGORITHM = TEMPTABLE”,视图将不支持INSERT和DELETE操作;
  • 视图中不包含基表中所有被定义为非空又未指定默认值的列,视图将不支持INSERT操作;
  • 在定义视图的SELECT语句中使用了 JOIN联合查询 ,视图将不支持INSERT和DELETE操作;
  • 在定义视图的SELECT语句后的字段列表中使用了 数学表达式 或 子查询 ,视图将不支持INSERT,也不支持UPDATE使用了数学表达式、子查询的字段值;
  • 在定义视图的SELECT语句后的字段列表中使用 DISTINCT 、 聚合函数 、 GROUP BY 、 HAVING 、UNION 等,视图将不支持INSERT、UPDATE、DELETE;
  • 在定义视图的SELECT语句中包含了子查询,而子查询中引用了FROM后面的表,视图将不支持
    INSERT、UPDATE、DELETE;
  • 视图定义基于一个 不可更新视图 ;
  • 常量视图。

虽然可以更新视图数据,但总的来说,视图作为 虚拟表 ,主要用于 方便查询 ,不建议更新视图的数据。对视图数据的更改,都是通过对实际数据表里数据的操作来完成的。

5. 删除视图


  • 删除视图只是删除视图的定义,并不会删除基表的数据

  • 删除视图的语法是:

    DROP VIEW IF EXISTS 视图名称;
    
    DROP VIEW IF EXISTS 视图名称1,视图名称2,视图名称3,...;
    
  • 举例

    DROP VIEW empvu80;
    
  • 说明:基于视图a、b创建了新的视图c,如果将视图a或者视图b删除,会导致视图c的查询失败。
    这样的视图c需要手动删除或修改,否则影响使用。


6. 总结


6.1 视图优点

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

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

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


6.2 视图缺点


如果我们在实际数据表的基础上创建了视图,那么,如果实际数据表的结构变更了,我们就需要及时对相关的视图进行相应的维护。特别是嵌套的视图(就是在视图的基础上创建视图),维护会变得比较复杂, 可读性不好 ,容易变成系统的潜在隐患。因为创建视图的 SQL 查询可能会对字段重命名,也可能包含复杂的逻辑,这些都会增加维护的成本。

实际项目中,如果视图过多,会导致数据库维护成本的问题。

所以,在创建视图的时候,你要结合实际项目需求,综合考虑视图的优点和不足,这样才能正确使用视图,使系统整体达到最优。



在这里插入图片描述

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

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

相关文章

STL之优先级队列(堆)的模拟实现与仿函数(8千字长文详解!)

STL之优先级队列(堆)的模拟实现与仿函数 文章目录 STL之优先级队列(堆)的模拟实现与仿函数优先级队列的概念priority_queue的接口介绍优先级队列的构造函数 priority_queue模拟实现类成员构造函数向下调整算法——正常实现 push向…

正负10V电压输入±电流输出伺服阀控制器

10V、4~20mA模拟指令输入伺服阀放大器是一种控制元件,用于控制液压系统中的比例阀或伺服阀。它主要由三个部分组成:比例阀或伺服阀、放大器。 比例阀或伺服阀是控制流量或压力的元件,它的输出信号通常是电压或电流。放大器用于将实际值转换为…

微信小程序开发uni-app-8分钟上手开发

本篇文章uni-app微信小程序开发-8分钟上手开发 -首先到微信小程序官网登录/注册微信小程序 微信小程序官网 uni-app 微信小程序 注册微信小程序 这里要注意: 激活邮箱之后,选择主体类型为 “个人类型”,并按要求登记主体信息。主体信息提…

一种直流转交流的代码实现 - through FFT

# show how to use FFT, filtered DC signal and return back to SampleValue-time zone. # the basic concept is coming from ChatGPT. # Write in python language. # # created by twicave. # Jun09,2023 # import numpy as np import matplotlib.pyplot as plt# 定义正弦信…

【C# 10 和 .NET 6】构建和使用 Web 服务(第16章)

Building and Consuming Web Services 构建和使用 Web 服务 本章介绍如何使用 ASP.NET Core Web API 构建 Web 服务(也称为 HTTP 或 REST 服务),以及如何使用 HTTP 客户端使用 Web 服务,这些客户端可以是任何其他类型的 .NET 应用…

Qt信号和槽

一、定义 信号与槽(Signal & Slot)是 Qt 编程的基础,也是 Qt 的一大创新。因为有了信号与槽的编程机制,在 Qt 中处理界面各个组件的交互操作时变得更加直观和简单。 信号(Signal)就是在特定情况下被发…

基于SpringBoot+vue的毕业生信息招聘平台设计和实现

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下…

淘宝618每日一猜答案6月12日 源氏木语获得多少个奖项?

淘宝6月12日每日一猜答案是什么?,接下来也会给大家来介绍一下6月12日淘宝大赢家每日一猜的答案。 淘宝每日一猜6月12日答案分享 活动问题:源氏木语获得多少个奖项? 活动答案:【15】 注意是阿拉伯数字! …

20230612 set1打卡

哈希表理论基础 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和

FPGA驱动FT601实现USB3.0相机 OV5640视频采集 提供2套工程源码和QT上位机源码

目录 1、前言2、FT601芯片解读和时序分析FT601功能和硬件电路FT601读时序解读FT601写时序解读 3、我这儿的 FT601 USB3.0通信方案4、vivado工程1--彩条视频采集传输详细设计框图及其原理vivado工程解读 5、vivado工程2--OV5640视频采集传输详细设计框图及其原理vivado工程解读 …

【几分醉意赠书活动 - 04期】 | 《C++、Linux、算法等系列众书》

个人主页: 几分醉意的CSDN博客主页_传送门 个人主页: 陈老板的CSDN博客主页_传送门 赠书活动 | 第四期 本期好书推荐:《C、Linux、算法等系列众书》 粉丝福利:书籍赠送:共计送出30本 参与方式:关注公众号&a…

【MySQL 数据查询】: 基本、分组、排序、聚合、分页、条件查询详解

前言 ✨欢迎来到小K的MySQL专栏,本节将为大家带来MySQL数据查询的讲解(基本、分组、排序、聚合、分页、条件查询) 目录 前言一、基本查询二、条件查询三、聚合函数(统计函数)四、分组查询五、排序查询五、分页查询六、总结 一、基本查询 MySQ…

全网最简单的软渲染器

引言 本文实现了一个包含矩阵变化、光栅化、面剔除、深度测试等功能的软渲染器。所谓软渲染器就是使用 CPU 渲染 3D 模型的程序。因此请记住我们的最终目的:将3D模型显示在屏幕上 。本文分为两个部分:预备知识、渲染器核心实现。预备知识概述了简化的渲…

可以在手机上使用的提醒事项软件有哪些

随着科技的进步,越来越多的人选择使用各种手机软件来提高自己的效率,高效率的手机软件已经成为人们生活和工作中不可或缺的一部分。其中,提醒事项软件是一种非常实用的工具,可以督促用户按时完成任务,有效防止遗忘。 …

chatgpt赋能python:如何利用Python在网上赚钱:一份SEO指南

如何利用Python在网上赚钱:一份SEO指南 随着互联网的快速发展和Python成为一种越来越受欢迎的编程语言,越来越多的人开始利用Python在网上赚取额外的收入。本篇文章将介绍一些Python工具和技术,以及SEO最佳实践,帮助你利用Python…

Spring Boot 回顾

Spring Boot 的发展是很快的,也使用了很多年。但是在工作中,还是发现了很多公司还没有怎么使用 Spring Boot,依旧是在使用 Spring MVC。于是决定复习总结一下。框架的进步和飞跃很重要,但是也不能一味追求新鲜事物,历史…

Yolo算法的演进—YoloCS有效降低特征图空间复杂度(附论文下载)

点击蓝字 关注我们 关注并星标 从此不迷路 计算机视觉研究院 公众号ID|计算机视觉研究院 学习群|扫码在主页获取加入方式 论文地址:YOLOCS: Object Detection based on Dense Channel Compression for Feature Spatial Solidification (arxiv…

【6.12 代随_55day】判断子序列、不同的子序列

判断子序列、不同的子序列 判断子序列动态规划方法图解步骤代码 不同的子序列1.方法图解步骤代码 判断子序列 力扣连接:392. 判断子序列(简单) 动态规划方法 (这道题也可以用双指针的思路来实现,时间复杂度也是O(n)…

Linux变卡cpu占用高,已装curl、wget但提示命令找不到(挖矿病毒)

现象 服务器变卡,top cpu占用非常高,但是进程占用只有1% 下载安装htop查看 看样子中了挖矿病毒 解决方式 修改/etc/hosts 把dev.fugglesoft.me 指向127.0.0.1 F9 -> enter杀掉进程 又多出来一个执行sh的,修改病毒sh,vi进去随便…

Portraiture5.0滤镜插件中文升级版本下载及功能介绍

专注人像修图,打造完美摄影作品,Portrait5.0是款最新版的人脸图像后期处理软件。它可以帮助用户快速编辑修图,提供全方面的人物美白效果,让用户可以更轻松地修图,操作简单,方便快捷,非常不错。新…