MySQL--视图

目录

1 认识视图

1.1 视图的定义

1.1 创建视图

1.2 查询

1.3 修改

1.4 删除

1.5 视图的优缺点

1.5.1 优点

1.5.2 缺点

1.6 视图的类型

1.7 视图与物化视图

2 视图检查选项

2.1 CASCADED

2.2 LOCAL

3 视图更新及作用

3.1 视图案列结合

3.1.1 屏蔽敏感数据

3.1.2 简化多表联查操作

3.2 MySQL 视图的作用

3.2.1 简化复杂查询

3.2.2  提高数据安全性

3.2.3 提供数据隔离

3.2.4 实现数据抽象

3.2.5  提高查询效率(某些场景)

3.2.6 支持逻辑分层

3.2.7 提高数据一致性

3.2.8 数据共享的便利性


1 认识视图

MySQL 视图(View)是一个虚拟表,它基于 SQL 查询的结果集。视图并不存储实际的数据,而是存储查询的定义。视图是一个强大的工具,可以简化复杂查询、提高数据安全性和逻辑数据独立性。理解视图的创建、使用和维护是有效管理数据库的重要部分。通过合理使用视图,可以提升数据库的灵活性和可用性。

  1.1 视图的定义

视图是一个 SQL 查询的命名结果集,可以像表一样进行查询。视图可以简化复杂的查询,使得数据访问更为方便。

  1.1 创建视图

CREATE [OR REPLACE] VIEW 视图名称[(列名列表)] AS SELECT [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]

  1.2 查询

查看创建视图语句

SHOW CREATE VIEW 视图名称;

查看视图数据:SELECT * FROM 视图名称;

  1.3 修改

某些视图是可更新的,可以通过视图直接更新底层表的数据。然而,并非所有视图都是可更新的。可更新视图的条件包括:

  • 视图基于单一表。
  • 视图不包含聚合函数、DISTINCT、GROUP BY、HAVING、UNION 等。

方式一:CREATE [OR REPLACE] VIEW 视图名称(列名列表)] AS SELECT 语句 [WITH [CASCADED I LOCAL] CHECK OPTION]

方式二:ALTER VIEW视图名称(列名列表)]AS SELECT语句[WITH[CASCADED LOCAL]CHECK OPTION]

  1.4 删除

DROP VIEW [[IF EXISTS ] 视图名称

  1.5 视图的优缺点

  1.5.1 优点
  • 简化查询:可以将复杂的查询封装成简单的视图,便于使用。
  • 数据安全:可以限制用户对底层表的访问,只暴露必要的数据。
  • 逻辑数据独立性:底层表的结构变化不会影响视图的使用,除非视图的 SQL 查询本身也需要更改。
  1.5.2 缺点
  • 性能开销:查询视图时,实际执行的是视图定义的 SQL 查询,可能会导致性能下降,尤其是对于复杂视图。
  • 更新限制:并非所有视图都可以更新,限制了某些操作。
  • 维护复杂性:视图的数量增多可能导致数据库结构变得复杂,影响维护。

  1.6 视图的类型

  • 简单视图:基于单一表的视图,通常可以直接更新。
  • 复杂视图:基于多个表的视图,包含连接、聚合等操作,通常不可更新。

  1.7 视图与物化视图

MySQL 不直接支持物化视图(Materialized Views),但可以使用临时表等方式模拟物化视图的效果。物化视图将查询结果存储在磁盘上,可以提高查询性能,但需要手动刷新数据。

2 视图检查选项

当创建视图时没有指定检查选项,则在插入,更新,删除数据时会出现不符合规定的出现

当使用检查选项时,会进行检查

当使用WITH CHECK OPTION子句创建视图时,MySQL会通过视图检查正在更改的每个行,例如插入,更新,删除,以使其符合视图的定义。MySQL允许基于另一个视图创建视图,它还会检查依赖视图中的规则以保持一致性。为了确定检查的范围,MySQL提供了两个选项:CASCADED和LOCAL,默认值为CASCADED。

  2.1 CASCADED

不仅会检查本视图的条件,还会检查所依赖视图的条件,一直往下传

满足视图三的检查约束,但不满足视图一的,插入数据失败

  2.2 LOCAL

会检查本视图的条件,如果依赖视图有检查约束则会进行检查约束,反之则不会检查

3 视图更新及作用

  3.1 视图案列结合

  3.1.1 屏蔽敏感数据

为了保证数据库表的安全性,开发人员在操作tb_user表时,只能看到的用户的基本字段,屏蔽手机号和邮箱两个字段。

create view tb_user_v_1 as select id,name.age from tb_user

  3.1.2 简化多表联查操作

查询每个学生所选修的课程(三张表联查),这个功能在很多的业务中都有使用到,为了简化操作,定义一个视图。

select s.,c.* from student s,course c,student_course sc where s.id= sc.student_id and c.id =sc.course_id

create view tb_stu_course_view as select s.,c.* from student s,course c,student_course sc where s.id= sc.student_id and c.id =sc.course_id

  3.2 MySQL 视图的作用

视图(View)是 MySQL 中的一种虚拟表,它并不存储数据,而是基于 SQL 查询结果的逻辑表示。视图的作用主要体现在以下几个方面:

  1. 简化查询:封装复杂查询逻辑,提升可读性和维护性。
  2. 提高安全性:限制用户访问底层表的数据。
  3. 数据隔离:为不同用户或场景定制数据表示。
  4. 隐藏复杂性:提供数据抽象层,隐藏底层表结构的变化。
  5. 逻辑分层:支持分层设计,分离业务逻辑与底层数据。
  6. 数据一致性:封装复杂的业务规则,统一计算逻辑。
  7. 共享数据:方便数据共享和复用。

  3.2.1 简化复杂查询

当查询逻辑非常复杂时,可以将复杂的 SQL 查询封装成一个视图。这样用户只需查询视图,而无需重复编写复杂的 SQL。

示例:

CREATE VIEW employee_info AS
SELECT e.id, e.name, d.department_name, s.salary
FROM employees e
JOIN departments d ON e.department_id = d.id
JOIN salaries s ON e.id = s.employee_id;

使用视图后:

SELECT * FROM employee_info WHERE salary > 5000;

作用

  • 简化了复杂的多表联接查询。
  • 提高了查询的可读性和维护性。

  3.2.2  提高数据安全性

视图可以限制用户对底层表的访问权限。通过视图,用户只能看到特定的列或行,而无法直接访问整个表的数据。

示例:

假设 employees 表包含敏感的工资信息,但只希望普通用户看到员工的姓名和部门:

CREATE VIEW public_employee_info AS
SELECT name, department_id
FROM employees;
  • 给用户只授予访问视图的权限: sql复制
GRANT SELECT ON public_employee_info TO 'user';

作用

  • 底层表中的敏感信息(如工资、身份证号等)不会暴露。
  • 提高了数据访问的安全性。

  3.2.3 提供数据隔离

视图可以为不同的用户或应用程序提供不同的数据表示。开发人员可以通过视图为不同场景定制数据,而无需修改底层表结构。

示例:

  • 一个视图专门为财务部门提供工资数据。
  • 另一个视图专门为人力资源部门提供员工信息。
CREATE VIEW finance_view AS
SELECT id, name, salary FROM employees;CREATE VIEW hr_view AS
SELECT id, name, department_id FROM employees;

作用

  • 为不同的用户或场景提供个性化的数据表示。
  • 保持底层表结构统一,避免重复创建表。

3.2.4 实现数据抽象

视图可以为表的底层结构提供一个抽象层,隐藏底层表的复杂性。即使底层表发生变化,只需要修改视图,而不需要修改依赖视图的查询。

示例:

假设原始表结构更改:

  • employees 表拆分成 employee_detailemployee_job 两张表,但应用程序仍然需要访问 employees 的数据。

可以通过视图模拟原始表结构:

CREATE VIEW employees AS
SELECT d.id, d.name, j.department_id, j.salary
FROM employee_detail d
JOIN employee_job j ON d.id = j.employee_id;

作用

  • 隐藏底层表的复杂变化。
  • 为应用程序提供稳定的接口,减少代码改动。

  3.2.5  提高查询效率(某些场景)

虽然视图本身不会直接提高性能,但在某些场景下,通过预定义的视图,可减少查询的复杂性,提高开发效率。同时,结合 物化视图(MySQL 8.0 并不原生支持,需要手动实现),可以显著提升查询性能。

示例:

如果某个复杂查询经常被重复使用,可以创建视图代替:

CREATE VIEW sales_summary AS
SELECT product_id, SUM(sales_amount) AS total_sales
FROM sales
GROUP BY product_id;

查询时直接使用视图:

SELECT * FROM sales_summary WHERE total_sales > 10000;

作用

  • 减少重复计算,降低开发工作量。

  3.2.6 支持逻辑分层

视图可以用于设计数据逻辑层,分离业务逻辑与底层数据,使系统结构更加清晰。

示例:

  • 基础视图:提供原始数据的抽象。
  • 中间视图:进行业务逻辑加工。
  • 高级视图:为最终用户提供数据。
-- 基础视图
CREATE VIEW base_view AS
SELECT * FROM employees;-- 中间视图
CREATE VIEW processed_view AS
SELECT id, name, department_id, salary * 1.1 AS adjusted_salary
FROM base_view;-- 高级视图
CREATE VIEW final_view AS
SELECT name, department_id, adjusted_salary
FROM processed_view
WHERE adjusted_salary > 5000;

作用

  • 分层设计,逻辑更清晰。
  • 更容易扩展和维护。

  3.2.7 提高数据一致性

视图可以封装复杂的业务规则,确保查询逻辑的一致性。例如,计算某些字段的值时,视图可以统一处理逻辑,减少人为错误。

示例:

假设工资总额需要动态计算:

CREATE VIEW total_salary_view AS
SELECT department_id, SUM(salary) AS total_salary
FROM employees
GROUP BY department_id;

通过视图,所有查询都会动态计算总工资,保证数据一致性:

SELECT * FROM total_salary_view;

作用

  • 避免重复实现业务逻辑。
  • 保证查询结果的一致性。

  3.2.8 数据共享的便利性

在团队协作场景中,视图可以用于共享数据。一旦创建视图,其他用户或开发者可以直接使用,不需要了解底层表的复杂结构。

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

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

相关文章

【工具】JS解析XML并且转为json对象

【工具】JS解析XML并且转为json对象 <?xml version1.0 encodingGB2312?> <root><head><transcode>hhhhhhh</transcode></head><body><param>ccccccc</param><param>aaaaaaa</param><param>qqqq<…

全球气候变化驱动因素预测,Python机器学习与深度学习

全球气候变化是现代社会面临的最重要的环境挑战之一&#xff0c;影响了气温、降水、海平面、生态系统等多个方面。气候变化的驱动因素主要包括温室气体排放、气溶胶浓度、火灾频发、海冰融化、叶绿素变化、植被变化和海洋温度上升等。这些因素在全球范围内交互作用&#xff0c;…

不同云计算网络安全等级

导读云计算的本质是服务&#xff0c;如果不能将计算资源规模化/大范围的进行共享&#xff0c;如果不能真正以服务的形式提供&#xff0c;就根本算不上云计算。 等级保护定级流程 定级是开展网络安全等级保护工作的 “基本出发点”&#xff0c;虚拟化技术使得传统的网络边界变…

账本模型

05-账本模型 1 账本模型 1.1 传统线性增长模型 传统的 MySQL 等系统采用线性增长的日志模型&#xff0c;通过一个 Leader 和多个 Follower 进行状态同步。这种方式有单点的带宽瓶颈问题。 1.2 区块链共享账本模型 共享账本&#xff1a;树形增长。在去中心化网络中&#xff0c;…

CPU、MPU、MCU和SOC学习笔记

CPU CPU是Central Processing Unit的缩写计算机的运算控制核心就是CPUCPU是由运算器、控制器和寄存器及相应的总线构成众所周知的三级流水线&#xff1a;取址、译码、执行的对象就是CPUCPU从存储器或高速缓冲存储器中取出指令&#xff0c;放入指令寄存器&#xff0c;并对指令译…

GaussDB(类似PostgreSQL)常用命令和注意事项

文章目录 前言GaussDB&#xff08;类似PostgreSQL&#xff09;常用命令和注意事项1. 连接到GaussDB数据库2. 查看当前数据库中的所有Schema3. 进入指定的Schema4. 查看Schema下的表、序列、视图5. 查看Schema下所有的表6. 查看表结构7. 开始事务8. 查询表字段注释9. 注意事项&a…

request和websocket

当然&#xff0c;可以为你详细介绍 FastAPI 中的 Request 对象。Request 对象在 FastAPI 中扮演着重要的角色&#xff0c;负责封装来自客户端的 HTTP 请求信息。了解 Request 对象的使用方法和属性&#xff0c;有助于你更高效地处理请求数据、访问请求上下文以及进行各种操作。…

深入探索Flax:一个用于构建神经网络的灵活和高效库

深入探索Flax&#xff1a;一个用于构建神经网络的灵活和高效库 在深度学习领域&#xff0c;TensorFlow 和 PyTorch 作为主流的框架&#xff0c;已被广泛使用。不过&#xff0c;Flax 作为一个较新的库&#xff0c;近年来得到了越来越多的关注。Flax 是一个由Google Research团队…

在1~n中、找出能同时满足用3除余2,用5除余3,用7除余2的所有整数。:JAVA

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 在1~n中、找出能同时满足用3除余2&#xff0c;用5除余3&#xff0c;用7除余2的所有整数。 输入描述: 输入一行&#xff0c;包含一个正整数n &#xff0c;n在100000以内 输出描述:…

Python 自动化办公的 10 大脚本

大家好&#xff0c;我是你们的 Python 讲师&#xff01;今天我们将讨论 10 个实用的 Python 自动化办公脚本。这些脚本可以帮助你简化日常工作&#xff0c;提高效率。无论是处理 Excel 文件、发送邮件&#xff0c;还是自动化网页操作&#xff0c;Python 都能派上用场。 1. 批量…

UNITY_GOF_ChainOfResponsibility

责任链模式 经理和高管可以响应采购请求或将其移交给上级。 每个位置都可以有自己的一套规则&#xff0c;他们可以批准这些订单。 首先有一个领导类专门负责处理这些请求之后根据权限分别对子类进行处理在调用的时候会根据处理类的权限进行处理&#xff0c;如果权限不足就传递给…

什么是Git

Git Git是什么&#xff1f;Git核心功能Git的常用命令Git原理对象存储Blob对象Tree对象 分支管理版本合并Git的工作流程Git的底层操作 Git是什么&#xff1f; Git是一种分布式版本控制系统&#xff0c;它可以帮助团队协作开发&#xff0c;跟踪代码变更历史&#xff0c;管理和维…

.net XSSFWorkbook 读取/写入 指定单元格的内容

方法如下&#xff1a; using NPOI.SS.Formula.Functions;using NPOI.SS.UserModel;using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime;using OfficeOpenXml.FormulaParsing.Excel.Functions.Numeric;/// <summary>/// 读取Excel指定单元格内容/// </summa…

704. 二分查找 C++

文章目录 一、题目链接二、参考代码三、所思所悟 一、题目链接 链接: 704. 二分查找 二、参考代码 int search(const vector<int>& nums, int target) {int left 0; int right nums.size() - 1;//左闭右闭[]while (left < right){int mid (left right) / 2;…

Matlab搜索路径添加不上

发现无论是右键文件夹添加到路径&#xff0c;还是在“设置路径”中专门添加&#xff0c;我的路径始终添加不上&#xff0c;导致代码运行始终报错&#xff0c;后来将路径中的“”加号去掉后&#xff0c;就添加成功了&#xff0c;经过测试&#xff0c;路径中含有中文也可以添加成…

知乎启用AutoMQ替换Kafka,开辟成本优化与运维提效新纪元

作者&#xff1a;知乎在线架构组 王金龙 关于知乎 知乎公司&#xff0c;成立于 2010 年 8 月 10 日&#xff0c;于 2011 年 1 月 26 日正式上线&#xff0c;是中文互联网的高质量问答社区和创作者聚集的原创内容平台。 知乎起步于问答&#xff0c;而超越了问答。知乎以「生…

Canal mysql数据库同步到es

Canal与Elasticsearch集成指南 [可视化工具](https://knife.blog.csdn.net/article/details/126348055)下载Canal 1.1.5版本 (alpha-2) 请从GitHub Releases下载Canal 1.1.5版本中间版本alpha-2。仅需下载canal.deployer和canal.adapter组件。 安装Elasticsearch 确保已安装…

LeetCode41:缺失的第一个正数

原题地址&#xff1a;41. 缺失的第一个正数 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1&#xff1a; 输入…

Python蒙特卡罗MCMC:优化Metropolis-Hastings采样策略Fisher矩阵计算参数推断应用—模拟与真实数据...

全文链接&#xff1a;https://tecdat.cn/?p38397 本文介绍了其在过去几年中的最新开发成果&#xff0c;特别阐述了两种有助于提升 Metropolis - Hastings 采样性能的新要素&#xff1a;跳跃因子的自适应算法以及逆 Fisher 矩阵的计算&#xff0c;该逆 Fisher 矩阵可用作提议密…

相机学习笔记——工业相机的基本参数

0、相机分类 图像颜色不同可以分为黑白相机和彩色相机&#xff1a;相同分辨率下&#xff0c;黑白工业相机相比彩色工业相机精度更高&#xff0c;检测图像边缘时&#xff0c;黑白工业相机成像效果更好。 芯片类型不同可以分为CCD相机和CMOS相机&#xff1a;CCD工业相机具有体积小…