MySQL-视图:视图概述、使用视图注意点、视图是否影响基本表
视图
- 一、视图概述
- 二、使用视图注意点
- 三、视图操作是否影响基本表
一、视图概述
在数据库管理系统中,视图(View)是一种虚拟表,它并不实际存储数据,而是基于一个或多个实际表的查询结果。视图提供了一种对数据库中数据进行抽象和封装的方式,用户可以按照自己的需求定义视图,并通过视图来操作和访问数据,而无需直接处理底层表结构的复杂性。
视图的主要特点:
1、逻辑表
:视图是从一个或多个基本表(或者其它视图)导出的虚表,其内容由查询语句定义,不独立存储实际数据。
2、数据安全性
:通过视图,数据库管理员可以控制用户对数据的访问权限,只让用户看到和修改他们需要的部分数据。
3、简化查询
:视图可以隐藏复杂的查询逻辑,使得用户可以使用更简洁的方式来访问数据。
4、数据整合
:从不同表中抽取相关的列组成视图,实现数据的逻辑整合。
5、数据更新限制
:并非所有的视图都可以用于插入、更新和删除操作,这取决于视图的定义方式以及数据库系统的支持程度。
视图创建与使用示例:
以MySQL为例
假设我们基于上述示例,为employees和departments表创建基本的建表语句:
-- 创建员工表
CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(100),department_id INT,salary DECIMAL(10, 2)
);-- 创建部门表
CREATE TABLE departments (id INT PRIMARY KEY,department_name VARCHAR(100)
);-- 插入一些示例数据
INSERT INTO departments (id, department_name) VALUES
(1, '销售部'),
(2, '技术部');INSERT INTO employees (id, name, department_id, salary) VALUES
(1, '张三', 1, 5000),
(2, '李四', 1, 6000),
(3, '王五', 2, 7000);
假设有一个员工表employees,包含id,name,department_id,salary等字段,还有一个部门表departments,包含id和department_name字段。为了方便员工查看自己所在部门的所有人员信息,我们可以创建一个视图:
CREATE VIEW employee_department AS
SELECT e.id, e.name, d.department_name, e.salary
FROM employees e
JOIN departments d ON e.department_id = d.id;
这样,用户就可以像查询真实表一样查询这个视图:
-- 查询销售部所有员工信息
SELECT * FROM employee_department WHERE department_name = '销售部';
需要注意的是,当基表中的数据发生变化时,通过视图查询到的结果也会随之变化,因为视图是动态反映其依赖的基础表的数据状态的。同时,如果视图允许更新操作,那么对视图的更新实际上会影响到对应的基表。
二、使用视图注意点
视图使用的一些注意点
在使用数据库视图时,需要注意以下几点,并通过例子来说明:
1、数据更新限制
: 视图可以用于查询操作,但并非所有视图都支持插入、更新和删除(DML操作)。这主要取决于视图的定义。如果视图包含了GROUP BY、DISTINCT、JOIN或者UNION等聚合或复杂操作,可能无法直接进行修改。例如:
-- 创建一个基于聚合函数的视图CREATE VIEW employee_avg_salary ASSELECT department_id, AVG(salary) as avg_salaryFROM employeesGROUP BY department_id;-- 尝试对这个视图进行更新,通常会失败,因为avg_salary是聚合函数的结果UPDATE employee_avg_salary SET avg_salary = 5000 WHERE department_id = 1;
2、权限管理
: 虽然视图可以用来实现数据安全性,但要谨慎管理用户对视图的权限。如果不正确地分配了权限,可能会导致用户通过视图间接访问到原本不应查看的数据。例如:
-- 假设有一个只显示部门A员工信息的视图CREATE VIEW department_A_employees ASSELECT * FROM employees WHERE department_id = 'A';-- 如果错误地赋予用户对这个视图的写权限,他们可能尝试更新实际表中的数据GRANT INSERT, UPDATE, DELETE ON department_A_employees TO user1;
3、性能影响
: 视图的操作最终会转换为对底层表的操作,因此,复杂的视图查询可能会影响性能。特别是当视图涉及多个表的JOIN或者包含子查询时,执行效率可能较低。为了提高性能,应确保视图定义简洁且有效利用索引。
4、依赖性与刷新
: 视图的内容依赖于其引用的基础表。一旦基础表的数据发生变化,通过视图查询得到的结果也会随之变化。但某些情况下,如物化视图,需要手动刷新才能获取最新的数据。
5、命名冲突
: 在创建视图时,要注意避免与已存在的表或视图名称发生冲突,以防止混淆和误操作。
6、维护成本
: 当基础表结构发生变化时,可能需要重新考虑并调整相关视图的定义,尤其是那些依赖于特定列名或字段顺序的视图。
7、嵌套视图
: 使用嵌套视图(即视图中包含其他视图)可能导致查询更加复杂,增加理解难度,并可能影响性能。在设计时尽量减少视图的嵌套层级,保持结构清晰。
三、视图操作是否影响基本表
视图的操作在特定条件下可以影响基本表。具体来说:
1、查询操作
:对视图进行SELECT查询不会直接影响基本表,它只是基于视图定义的查询语句从基本表中检索数据。
2、插入(INSERT)、更新(UPDATE)和删除(DELETE)操作
:
-
在某些情况下,用户可以在视图上执行DML操作,并且这些操作会反映到相应的基表中。但是,这要求视图满足以下条件:
- 视图必须是可更新视图,即视图中的每一行都能唯一映射回基表的一行。
- 更新操作不能违反任何约束,如主键、外键或唯一性约束。
- 不涉及分组函数、DISTINCT、JOIN等非确定性或复杂的表达式。
-
当在符合上述条件的视图上执行修改操作时,数据库系统会将这些修改转换成对基础表的相应操作。
3、不符合更新条件的情况
:
- 如果视图不满足可更新条件,通常无法直接通过视图来更改底层表的数据,试图这样做可能会导致错误或者数据库系统拒绝执行该操作。总结而言,视图本身不存储数据,但针对部分允许更新的视图进行操作时,确实能够间接影响到关联的基本表。然而,对于那些设计为只读或结构复杂不支持更新的视图,则不会对基本表造成影响。
MySQL-视图:视图概述、使用视图注意点、视图是否影响基本表 到此完结,笔者归纳、创作不易,大佬们给个3连再起飞吧
相关文章:

MySQL-视图:视图概述、使用视图注意点、视图是否影响基本表
视图 一、视图概述二、使用视图注意点三、视图操作是否影响基本表 一、视图概述 在数据库管理系统中,视图(View)是一种虚拟表,它并不实际存储数据,而是基于一个或多个实际表的查询结果。视图提供了一种对数据库中数据…...

鸿蒙开发(四)-低代码开发
鸿蒙开发(四)-低代码开发 本文主要介绍下鸿蒙下的低代码开发。 鸿蒙低代码是指在鸿蒙操作系统进行应用开发时,采用简化开发流程和减少编码量的方式来提高开发效率。 1:开启低代码开发 首先我们打开DevEco Studio .然后创建工程。 如图所示ÿ…...

BUU [网鼎杯 2020 半决赛]AliceWebsite
BUU [网鼎杯 2020 半决赛]AliceWebsite 开题: hint附件是源码。在index.php中有一个毫无过滤的本地文件包含 <?php $action (isset($_GET[action]) ? $_GET[action] : home.php); if (file_exists($action)) {include $action; } else {echo "File not…...

超越 Siri 和 Alexa:探索LLM(大型语言模型)的世界
揭秘LLM:语言模型新革命,智能交互的未来趋势 近年来,虚拟助手的世界发生了重大转变。 虽然 Siri 和 Alexa 本身就是革命性的,但一种称为大型语言模型 (LLM) 的新型人工智能正在将虚拟助手的概念提升到一个全新的水平。 在这篇博文…...
Linux删除Mysql
//rpm包安装方式卸载 查包名:rpm -qa|grep -i mysql 删除命令:rpm -e –nodeps 包名//yum安装方式下载 1.查看已安装的mysql 命令:rpm -qa | grep -i mysql 2.卸载mysql 命令:yum remove mysql-community-server-5.6.36-2.el7.x86…...
CNN中常见的池化操作有哪些,作用是什么?
CNN中常见的池化操作有哪些,作用是什么? CNN中常见的池化操作只要是两种,平均值池化和最大值池化最大值池化常用于分类任务,是指在输入数据的局部区域内取最大值作为输出。最大池化的作用是降低特征图的尺寸,减少参数…...

能打印单据的软件,如进出库单据,物流快运单据,定制单据样式
能打印单据的软件,如进出库单据,物流快运单据,定制单据样式 一、前言 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、不同行业打印的单据不同 2、同一个行业打印的样式可能不同 3、有的行业已经印刷好了许多打印…...

uniapp列表进入动画
app列表入场动画 - DCloud 插件市场 列表入场动画https://ext.dcloud.net.cn/plugin?id16957...
FPGA TestBench编写学习
1 timescale 1.1 简介 timescale指令用于指定编译器在处理仿真时的时间单位和时间精度。这个指令通常在模块的顶层声明中使用,它告诉编译器和仿真器如何解释代码中的时间值。 timescale指令的语法如下: timescale <time_unit> <time_precis…...
Centos7 安装mongoDB
下载安装包 curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.2.12.tgz 解压 tar -zxvf mongodb-linux-x86_64-3.2.12.tgz移动到指定位置 mv mongodb-linux-x86_64-3.2.12/ /usr/local/mongodb在/usr/local/mongodb下创建文件夹 cd /usr/local/mongodb m…...

Redis冲冲冲——Redis持久化方式及其区别
目录 引出Redis持久化方式Redis入门1.Redis是什么?2.Redis里面存Java对象 Redis进阶1.雪崩/ 击穿 / 穿透2.Redis高可用-主从哨兵3.持久化RDB和AOF4.Redis未授权访问漏洞5.Redis里面安装BloomFilte Redis的应用1.验证码2.Redis高并发抢购3.缓存预热用户注册验证码4.R…...

谷粒商城【成神路】-【10】——缓存
目录 🧂1.引入缓存的优势 🥓2.哪些数据适合放入缓存 🌭3.使用redis作为缓存组件 🍿4.redis存在的问题 🧈5.添加本地锁 🥞6.添加分布式锁 🥚7.整合redisson作为分布式锁 🚗…...

Facebook、亚马逊账号如何养号?
之前我们讨论过很多关于代理器的问题。它们的工作原理是什么?在不同的软件中要使用那些代理服务器?这些代理服务器之间的区别是什么?什么是反检测浏览器等等。 除了这些问题,相信很多人也会关心在使用不同平台的时代理器的选择问题。比如,为什么最好…...

Milvus的相似度指标
官网:https://milvus.io/docs/metric.md版本: v2.3.x 在 Milvus 中,相似度度量用于衡量向量之间的相似度。选择良好的距离度量有助于显着提高分类和聚类性能。下表展示了这些广泛使用的相似性指标如何与各种输入数据形式和 Milvus 索引相匹配。 一、浮…...
如何在unity中实现倒计时
public class showtime : MonoBehaviour {public TextMeshProUGUI Countdown;void Update(){if (Input.GetKeyDown(KeyCode.Space))//如果按下空格后开始倒计时{StartCoroutine(hahaha());}}IEnumerator hahaha()//声明了一个协程函数 hahaha{int time 10;Countdown.text tim…...

蓝桥杯简单题,公司名称
题目链接(需要登录) #include <iostream> #include <cstring> #include <algorithm> using namespace std; bool lanqiao(string str,int len){ sort(str.begin(),str.end());//对str按照ascii排序if(str.find("Laainoq")s…...

【linux】02 :Linux基础命令
1.掌握linux系统的目录结构 linux只有一个顶级目录,称之为:根目录。 windows系统有多个顶级目录,即各个盘符。 2.linux路径的描述方式 /在Linux中的表示:出现在开头表示根目录,出现在后面表示层级关系。 3.什么是命…...

AOP切面编程,以及自定义注解实现切面
AOP切面编程 通知类型表达式重用表达式切面优先级使用注解开发,加上注解实现某些功能 简介 动态代理分为JDK动态代理和cglib动态代理当目标类有接口的情况使用JDK动态代理和cglib动态代理,没有接口时只能使用cglib动态代理JDK动态代理动态生成的代理类…...
C70600 CuNi10Fe1Mn铜合金深冲性能好
C70600 CuNi10Fe1Mn铜合金深冲性能好CW608N-R460、CW608N-H135、CuZn36Pb2As-R370、CuZn38Pb1-R460、CW607N-H120、CuZn38Pb1-H120、CW602N-H080、CW608N-H105、CuZn39Pb0.5-R460、CuZn39Pb0.5-H120、CW608N-H120、CuZn38Pb1-R470、CW607N-H080、CW607N-R470、CW607N-H105、CuZ…...

算法学习05:离散化、区间合并
算法学习05:离散化、区间合并 文章目录 算法学习05:离散化、区间合并前言需要记忆的模版:一、离散化1.例题:离散化 区间和:拓展: 二、区间合并(贪心)1.例题: 总结 前言 需要记忆的模…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...