MySQL-视图:视图概述、使用视图注意点、视图是否影响基本表

视图

    • 一、视图概述
    • 二、使用视图注意点
    • 三、视图操作是否影响基本表

一、视图概述

在数据库管理系统中,视图(View)是一种虚拟表,它并不实际存储数据,而是基于一个或多个实际表的查询结果。视图提供了一种对数据库中数据进行抽象和封装的方式,用户可以按照自己的需求定义视图,并通过视图来操作和访问数据,而无需直接处理底层表结构的复杂性

视图的主要特点:

1、逻辑表:视图是从一个或多个基本表(或者其它视图)导出的虚表,其内容由查询语句定义,不独立存储实际数据。
2、数据安全性:通过视图,数据库管理员可以控制用户对数据的访问权限,只让用户看到和修改他们需要的部分数据。
3、简化查询:视图可以隐藏复杂的查询逻辑,使得用户可以使用更简洁的方式来访问数据。
4、数据整合:从不同表中抽取相关的列组成视图,实现数据的逻辑整合。
5、数据更新限制:并非所有的视图都可以用于插入、更新和删除操作,这取决于视图的定义方式以及数据库系统的支持程度。

视图创建与使用示例:
以MySQL为例
假设我们基于上述示例,为employeesdepartments表创建基本的建表语句:

-- 创建员工表
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连再起飞吧

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

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

相关文章

题目 2132: T1268-完全背包问题

题目描述: 设有n种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从n种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于M,而价值的和为最…

RabbitMQ备份交换机

1. 备份交换机 备份交换机可以理解为 RabbitMQ 中交换机的“备胎”,当我们为某一个交换机声明一个对应的备份交换机时,就是为它创建一个备胎,当交换机接收到一条不可路由消息时,将会把这条消息转发到备份交换机中,由备…

reids设计与实现(一)——数据对象

文章目录 1. 前言2. redis 动态字符串2.1. 字符串的数据结构:2.2. 剖析,length;2.3. 剖析,free;2.3. 使用c字符串函数; 3. redis 链表4. 字典5. 跳跃表 1. 前言 reids作为最常用的缓存数据库,深…

web3 DePIN赛道之OORT

文章目录 什么是DePIN什么是oort背景:去中心化云计算场景团队OORT AIOORT StorageOORT Compute 参考 什么是DePIN DePIN是Decentralized Physical Infrastructure Networks的简称,中文意思就是去中心化的网络硬件基础设施,是利用区块链技术和代币奖励来调动分散在世…

mysql笔记:2. 表操作

文章目录 创建表创建表主键约束外键约束非空约束唯一约束默认值约束 查看数据表结构查看表详细结构 修改数据表修改表名修改字段名修改字段数据类型添加字段删除字段更改表的存储引擎 删除数据表删除没被关联的表删除被关联的表 数据表是数据库中最重要、最基本的操作对象&…

单例九品--第九品[可用的设计]

单例九品--第九品[可用的设计] 上一品引入写在前边代码部分实现方式的评注和思考写在最后 上一品引入 自第五品以来,为解决第四品的静态初始化灾难问题,将全局对象设置为指针类型,但是指针是有被修改的风险。所以第八品将全局单例对象封装在…

2024.02.07 校招 实习 内推 面经

绿*泡*泡VX: neituijunsir 交流*裙 ,内推/实习/校招汇总表格 1、校招 | 腾讯TEG 2024 校招开放全新机会,持续热招(内推) 校招 | 腾讯TEG 2024 校招开放全新机会,持续热招(内推) …

【MATLAB】MATLAB学习笔记

MATLAB入门 基础操作变量命名数据类型逻辑和流程控制循环结构分支结构 绘图基本操作二维平面绘图绘图参数三位立体绘图图像窗口的分割 本文参考B站视频:BV13D4y1Q7RS 由于我对于C语言很熟悉,很多语法是会参考C来学 基础操作 清屏%% 清空环境变量及命令 …

图腾柱PFC工作原理:一张图

视屏链接: PFC工作原理

Java SE入门及基础(33)

final 修饰符 1. 应用范围 final 修饰符应该使用在类、变量以及方法上 2. final 修饰类 Note that you can also declare an entire class final. A class that is declared final cannot be subclassed. This is particularly useful, for example, when creating an imm…

docker学习笔记——Dockerfile

Dockerfile是一个镜像描述文件,通过Dockerfile文件可以构建一个属于自己的镜像。 如何通过Dockerfile构建自己的镜像: 在指定位置创建一个Dockerfile文件,在文件中编写Dockerfile相关语法。 构建镜像,docker build -t aa:1.0 .(指…

Effective C++ 学习笔记 条款22 将成员变量声明为private

下面是作者的规划。首先带你看看为什么成员变量不该是public,然后让你看看所有反对public成员变量的论点同样适用于protected成员变量。最后导出一个结论:成员变量应该是private。获得这个结论后,本条款也就大功告成了。 好,现在…

【Vue】生命周期

Vue生命周期 就是一个Vue实例从创建 到 销毁 的整个过程 生命周期四个阶段 1.创建阶段:创建响应式数据 2.挂载阶段:渲染模板 3.更新阶段:修改数据,更新视图 4.销毁阶段:销毁Vue实例 生命周期钩子 Vue生命周期过…

【每日一题】2834. 找出美丽数组的最小和-2024.3.8

题目: 2834. 找出美丽数组的最小和 给你两个正整数:n 和 target 。 如果数组 nums 满足下述条件,则称其为 美丽数组 。 nums.length n.nums 由两两互不相同的正整数组成。在范围 [0, n-1] 内,不存在 两个 不同 下标 i 和 j &…

阿里云实现两个VPC网络资源互通

背景 由于实际项目预算有限,两套环境虽然分别属于不同的专有网络即不同的VPC,但是希望借助一台运维机器实现对两个环境的监控和日常的运维操作 网络架构 如下是需要实现的外网架构图,其中希望实现UAT环境的一台windows的堡垒机可以访问生产…

前端软件工程师100问?

作为一个前端软件工程师,可能会遇到的问题非常多,以下是我为您精选的100个常见问题: 以上100个问题涵盖了前端开发的基础知识、框架应用、性能优化、安全性、兼容性、前沿技术等多个维度。作为前端软件工程师,了解这些问题有助于提…

第G3周:CGAN入门|生成手势图像

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 一、前置知识 CGAN(条件生成对抗网络)的原理是在原始GAN的基础上,为生成器和判别器提供 额外的条件信息…

【linux】04 :linix实用操作

1.常用快捷键 ctrlc表示强制停止。linux某些程序的运行,如果想强制停止,可以使用;命令输入错误,也可以通过ctrlc,退出当前输入,重新输入。 ctrld表示退出登录,比如退出root以回到普通用户,或者…

Stable Diffusion 模型下载:ZavyChromaXL(现实、魔幻)

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 作者述:该模型系列应该是用于 SDXL 的 ZavyMix SD1.5 模型的延续。主要重点是获…

背包问题算法

背包问题算法 0-1背包问题二维数组一维数组 完全背包问题二维数组一维数组 多重背包问题一维数组 0-1背包问题 问题:背包的容量为9,有重量分别为[2, 4, 6, 9]的四个物品,价值分别为[3, 4, 5, 6],求背包能装的物品的最大价值是多少…