0 序言

本文将系统讲解数据库中视图的相关知识,包括视图的定义作用创建(单表、多表、基于视图创建)、查看更新修改删除操作,以及视图的优缺点。

通过学习,你能够掌握视图的基本概念,理解何时及如何合理使用视图,提升数据库操作的灵活性与安全性。

1 常见的数据库对象

数据库包含多种对象,各自承担不同功能,具体如下:

1.1 表(TABLE)

存储数据的逻辑单元,以行和列的形式存在,列即字段,行即记录。

1.2 数据字典

是系统表,存放数据库相关信息,数据通常由数据库系统维护,程序员一般只可查看,不应修改。

1.3 约束(CONSTRAINT)

用于执行数据校验的规则,目的是保证数据的完整性。

1.4 视图(VIEW)

是一个或多个数据表里数据的逻辑显示,本身不存储数据。

1.5 索引(INDEX)

用于提高查询性能,类似书的目录。

1.6 存储过程(PROCEDURE)

用于完成一次完整的业务处理,无返回值,但可通过传出参数传递多个值给调用环境。

1.7 存储函数(FUNCTION)

用于完成一次特定的计算,具有一个返回值。

1.8 触发器(TRIGGER)

相当于事件监听器,当数据库发生特定事件后被触发,完成相应处理。

2. 视图概述

2.1 为什么使用视图

数据访问控制:可针对不同用户提供不同查询视图,限制数据可见范围,如对销售人员隐藏采购价格、对普通员工隐藏薪酬敏感字段。
简化查询:将常用查询结果集封装为视图,减少重复编写复杂查询语句的工作量。
数据格式化:可对数据进行格式化处理,方便按特定格式展示,如拼接员工姓名与部门名。

2.2 视图的理解

视图是一种虚拟表,本身不存储数据,仅占用少量内存空间,其数据来源于基表(赖以建立的已有表)。
视图的创建和删除仅影响自身,不影响基表;但对视图数据的增删改会同步影响基表,反之亦然。

视图的数据由SELECT语句提供,自身不保存数据,仅作为基表数据的另一种表现形式。

3. 创建视图

3.1 基本语法

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

精简版:CREATE VIEW 视图名称 AS 查询语句

3.2 创建单表视图

3.2.1 示例1:直接使用SELECT字段作为视图字段

-- 创建视图empvu80,包含80号部门员工的ID、姓氏、薪资
CREATE VIEW empvu80
AS 
SELECT employee_id, last_name, salary
FROM employees
WHERE department_id = 80;-- 查询视图
SELECT * FROM empvu80;

在这里插入图片描述

3.2.2 示例2:指定视图字段别名

-- 创建视图emp_year_salary,包含员工姓名和年薪(含佣金)
CREATE VIEW emp_year_salary (ename, year_salary)
AS 
SELECT ename, salary*12*(1+IFNULL(commission_pct,0))
FROM t_employee;

在这里插入图片描述

这里要注意一点:

若未指定视图字段列表,默认与SELECT语句字段列表一致;
SELECT字段有别名,视图字段名与别名相同

3.3 创建多表联合视图

3.3.1 示例1:两表内连接

-- 创建视图empview,关联员工表和部门表,包含员工ID、姓名、部门名
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;

在这里插入图片描述

3.3.2 示例2:带聚合函数的联合视图

-- 创建视图dept_sum_vu,统计各部门薪资的最小、最大、平均值
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;

在这里插入图片描述

3.3.3 示例3:数据格式化视图

-- 创建视图emp_depart,格式化员工姓名与部门名(格式:姓名(部门名))
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_id;

在这里插入图片描述

3.4 基于视图创建视图

基于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;

4. 查看视图

4.1 查看数据库中的视图对象

-- 显示数据库中所有表和视图
SHOW TABLES;

在这里插入图片描述

4.2 查看视图结构

-- 查看视图empvu80的结构
DESC empvu80;
-- 或
DESCRIBE empvu80;

在这里插入图片描述

4.3 查看视图属性信息

-- 查看视图empvu80的存储引擎、版本等信息(Comment为VIEW表示是视图)
SHOW TABLE STATUS LIKE 'empvu80'\G

在这里插入图片描述

4.4 查看视图详细定义

-- 查看视图empvu80的创建语句
SHOW CREATE VIEW empvu80;

在这里插入图片描述

5. 更新视图的数据

5.1 一般情况

MySQL支持通过INSERT、UPDATE、DELETE操作视图数据,且会同步影响基表,反之亦然。
示例1:UPDATE操作

-- 修改emp_tel视图中"孙洪亮"的电话
UPDATE emp_tel SET tel = '13789091234' WHERE ename = '孙洪亮';
-- 基表t_employee中对应数据同步更新
SELECT ename,tel FROM t_employee WHERE ename = '孙洪亮'; -- 结果:孙洪亮 13789091234

这里跟上文约束那一篇里面写到的主表跟从表,

有个示例也是效果如此。

一个表的信息变动另一个表相关联的信息也会随着更新。

示例2:DELETE操作

-- 删除emp_tel视图中"孙洪亮"的记录
DELETE FROM emp_tel WHERE ename = '孙洪亮';
-- 基表t_employee中对应记录同步删除
SELECT ename,tel FROM t_employee WHERE ename = '孙洪亮'; -- 结果:空集

5.2 不可更新的视图

当视图满足以下情况时,不支持INSERT、UPDATE、DELETE操作:

  • 定义时指定ALGORITHM = TEMPTABLE(不支持INSERT、DELETE);
  • 不包含基表中所有非空且无默认值的列(不支持INSERT);
  • SELECT语句使用JOIN联合查询(不支持INSERT、DELETE);
  • 字段列表包含数学表达式或子查询(不支持INSERT,且无法UPDATE该字段);
  • 使用DISTINCT聚合函数GROUP BYHAVINGUNION等(不支持增删改);
  • SELECT包含子查询且引用FROM后的表(不支持增删改);
  • 基于不可更新的视图创建
  • 常量视图。

比如说:

-- 创建基于两表连接的视图emp_dept
CREATE VIEW emp_dept
AS SELECT ename,salary,birthday,tel,email,hiredate,dname
FROM t_employee INNER JOIN t_department
ON t_employee.did = t_department.did;-- 插入数据会失败(JOIN视图不支持INSERT)
INSERT INTO emp_dept(ename,salary,birthday,tel,email,hiredate,dname)
VALUES('张三',15000,'1995-01-08','18201587896','zs@atguigu.com','2022-02-14','新部门');

这里会报错,错误内容:Can not modify more than one base table through a join view

意思就是说,你现在这个JOIN视图不支持用INSERT语法进行插入数据。

6. 修改与删除视图

6.1 修改视图

方式1:使用CREATE OR REPLACE VIEW

-- 修改empvu80视图,包含员工ID、全名(名+姓)、薪资、部门ID
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;

在这里插入图片描述

这里的图片还不够直观,

补充上姓名数据会看起来更加直观,

就好比本来是张 三,一个放在lastname,一个在firstname,

然后这里的作用就是变成一个name里面存放的就是张三

方式2:使用ALTER VIEW

-- 修改视图salvu50的查询条件
ALTER VIEW salvu50
AS 
SELECT employee_id ID_NUMBER, last_name NAME, salary*12 ANN_SALARY
FROM employees
WHERE department_id = 60; -- 原条件为department_id = 50

同理,这种方法也能实现相同的效果。

6.2 删除视图

-- 删除视图empvu80(IF EXISTS避免视图不存在时报错)
DROP VIEW IF EXISTS empvu80;

说明:删除基视图会导致依赖它的视图查询失败,需手动维护。

7 小结

7.1 视图的优点

操作简单:封装复杂查询,简化开发人员对数据库的操作,无需关注基表结构与关联关系。
减少数据冗余:仅存储查询语句,不占用数据存储资源。
数据安全:限制用户访问范围,通过视图隔离用户与基表,保障数据安全。
适应需求变化:减少因基表结构变更带来的工作量。
分解复杂逻辑:将复杂查询拆分为多个视图,组合完成复杂逻辑。

7.2 视图的不足

维护成本高:基表结构变更时需同步维护视图,嵌套视图维护更复杂。
潜在隐患:视图定义可能包含重命名、复杂逻辑,降低可读性,增加系统风险。
过多视图问题:实际项目中视图过多会增加数据库维护难度。

通过本文学习,我们要掌握视图的创建、操作及应用场景,合理使用视图提升数据库操作效率与安全性。

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

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

相关文章

移动云×华为昇腾:“大EP+PD分离”架构实现单卡吞吐量跨越式提升!

在面向下一代AI基础设施的关键技术攻关中,移动云与华为昇腾计算团队深度协同,实现了大模型推理引擎的架构级突破。双方基于昇腾AI基础软硬件平台,针对DeepSeek大模型完成了大规模专家并行(Expert Parallelism,简称“大…

配电自动化终端中电源模块的设计

配电自动化终端中电源模块的设计 引言 配电终端设备的可靠性和自动化程度,直接影响到整个配电自动化系统的可靠性和自动化水平。由于配电终端设备一般安装于户外或比较偏僻的地方,不可能有直流电源提供,因此,配电网终端设备的直流供电方式成为各配网自动化改造中必须要研究…

性能测试-groovy语言1

课程:B站大学 记录软件测试-性能测试学习历程、掌握前端性能测试、后端性能测试、服务端性能测试的你才是一个专业的软件测试工程师 Jmeter之Groovy语言Groovy简介为何性能测试中选择Groovywindows下载Groovy进入官网配置环境变量Groovy的数据类型groovy的保留字字符…

天邑TY1613_S905L3SB_安卓9-高安非-高安版-通刷-TTL线刷固件包

天邑TY1613_S905L3SB_安卓9-高安非-高安版-通刷-TTL线刷固件包刷机说明:本固件为TTL刷机方式,需要准备如下工具;电烙铁TTL线刷机优盘TTL接触点位于处理器左侧,从上往下数第二脚GND、3TXD、4RXD跑码工具-【工具大全】-putty跑码工具…

【硬件-笔试面试题】硬件/电子工程师,笔试面试题-7,(知识点:晶体管放大倍数计算)

目录 1、题目 2、解答 3、相关知识点 晶体管的电流分配关系 直流电流放大系数\(\overline{\beta}\) 交流电流放大系数\(\beta\) 晶体管的放大条件 总结 【硬件-笔试面试题】硬件/电子工程师,笔试面试题汇总版,持续更新学习,加油&…

力扣-152.乘积最大子数组

题目链接 152.乘积最大子数组 class Solution {public int maxProduct(int[] nums) {int[] dpMax new int[nums.length]; //包括nums[i]的乘积最大值int[] dpMin new int[nums.length]; //包括nums[i]的乘积最小值int res nums[0];dpMax[0] nums[0];dpMin[0] nums[0];fo…

HTTP/1.0、HTTP/1.1 和 HTTP/2.0 主要区别

一句话总结 HTTP/1.0: 短连接,每次请求都需要建立一个新的 TCP 连接,性能较差。HTTP/1.1: 长连接,默认开启 Keep-Alive,连接可复用,解决了 1.0 的大部分问题,是目前使用最广泛的版本。HTTP/2.0: 二进制、多…

Navicat 17.3 正式发布 | 现已支持达梦、金仓和 IvorySQL 数据库

🚀🚀🚀 Navicat 很高兴地宣布:Navicat 17.3 版本正式发布。此次更新包含多项突破性功能,包括新增对达梦、金仓和 IvorySQL 等数据库的支持,全面强化 AI 功能并新增阿里通义千问等 AI 大模型,同…

前端性能新纪元:Rust + WebAssembly 如何在浏览器中实现10倍性能提升(以视频处理为例)

前端性能新纪元:Rust WebAssembly 如何在浏览器中实现10倍性能提升(以视频处理为例) JavaScript,作为 Web 开发的基石,是动态的、灵活的,但在性能上,它也存在着天生的“软肋”。对于那些计算密…

Web前端:JavaScript find()函数内判断

🎯 find是什么?find() 是 JavaScript 数组(Array)提供的一个内置方法,用于在数组中查找第一个满足条件的元素。简单来说:它像侦探一样遍历数组,找到第一个符合条件的成员就返回它。⚙️ 核心作用…

MySQL详解三

MySQL详解三事务ACID特性原子性一致性隔离性持久性事务的隔离级别读未提交(Read Uncommitted)读已提交(Read Committed)可重复读(Repeatable Read)串行化(serializable)MVCC聚集索引的隐藏列read view锁全局…

ABQ-LLM:用于大语言模型的任意比特量化推理加速

温馨提示: 本篇文章已同步至"AI专题精讲" ABQ-LLM:用于大语言模型的任意比特量化推理加速 摘要 大语言模型(LLMs)在自然语言处理任务中取得了革命性的进展。然而,其实际应用受到巨大的内存与计算开销的限制…

kafka的shell操作

Kafka 提供了丰富的 shell 命令工具,位于 Kafka 安装目录的 bin/ 目录下(Windows 系统为 bin/windows/)。这些命令用于管理主题、生产者、消费者、分区等核心组件。以下是常用的 Kafka shell 操作大全:一、主题(Topic&…

client-go: k8s选主

快速上手 下面这个代码就是一个选主的大概逻辑 package mainimport ("context""flag""fmt"_ "net/http/pprof""os""path/filepath""time""golang.org/x/exp/rand"v1 "k8s.io/api/core/v…

为什么Java的String不可变?

为什么Java的String不可变? 场景: 你在开发多线程用户系统时,发现用户密码作为String传递后,竟被其他线程修改。这种安全隐患源于对String可变性的误解。Java将String设计为不可变类,正是为了解决这类核心问题。 1️⃣…

在Ubuntu上使用QEMU学习RISC-V程序(1)起步第一个程序

文章目录一、 引言二、 环境准备三、编写简单的RISC-V程序四、 编译步骤详解五、使用QEMU运行程序六、程序详解七、退出QEMU八、总结附录:QEMU中通过UTRA显示字符工作原理1、内存映射I/O原理2、add.s程序工作流程3、关键指令解析4、QEMU模拟的UART控制器5、为什么不…

R拟合 | 一个分布能看到三个峰,怎么拟合出这三个正态分布的参数? | 高斯混合模型 与 EM算法

1. 效果已知数据符合上图分布,怎么求下图的三个分布的参数mu, sigma,及每个分布的权重 lambda? 2. 代码: 高斯混合模型(Gaussian Mixture Model,简称GMM) library(mixtools) set.seed(123) # 确保结果可重复…

Excel自动分列开票工具推荐

软件介绍 本文介绍一款基于Excel VBA开发的自动分列开票工具,可高效处理客户对账单并生成符合要求的发票清单。 软件功能概述 该工具能够将客户对账单按照订单号自动拆分为独立文件,并生成可直接导入发票清单系统的标准化格式。 软件特点 这是一款体…

【自用】JavaSE--Stream流

概述获取Stream流集合的stream流集合名.stream( );collection集合List集合与Set集合都属于Collection集合,因此可以直接调用stream方法获取stream流,示例如下结果>map集合map集合存在键值对,因此无法使用该方法直接获取stream流&#xff0…

【Elasticsearch】快照与恢复功能详解

《Elasticsearch 集群》系列,共包含以下文章: 1️⃣ 冷热集群架构2️⃣ 合适的锅炒合适的菜:性能与成本平衡原理公式解析3️⃣ ILM(Index Lifecycle Management)策略详解4️⃣ Elasticsearch 跨机房部署5️⃣ 快照与恢…