MySQL 视图入门
一、什么是 MySQL 视图
1.1 视图的基本概念
在 MySQL 中,视图是一种虚拟表,它本身并不存储实际的数据,而是基于一个或多个真实表(基表)的查询结果集。可以把视图想象成是一个预定义好的查询语句的快捷方式。当你查询视图时,MySQL 会动态地执行定义视图时的查询语句,并返回结果,就好像你直接查询了一个真实的表一样。
举个简单的生活例子,假设你有一个装满各种文件的大文件夹,里面的文件按照不同的主题、日期等分类存放。有时候你只需要查看某一类特定的文件,比如最近一周内关于项目 X 的文件。每次都手动去大文件夹里筛选这些文件会很麻烦,于是你可以创建一个“快捷方式”,这个快捷方式会自动帮你找到并显示符合条件的文件。在 MySQL 里,视图就类似于这个“快捷方式”。
1.2 视图与表的区别
- 数据存储:表是实际存储数据的容器,数据会被持久化保存在磁盘上;而视图只是一个逻辑上的概念,它不存储数据,数据仍然存储在基表中。
- 操作方式:对表可以进行插入、更新、删除等操作,这些操作会直接影响表中的实际数据;对视图也可以进行部分操作,但这些操作最终还是会映射到基表上,并且有些视图可能不允许进行某些操作(后面会详细介绍)。
二、MySQL 视图的作用
2.1 简化复杂查询
在实际的数据库应用中,查询语句可能会非常复杂,涉及多个表的连接、子查询、复杂的条件过滤等。使用视图可以将这些复杂的查询封装起来,用户只需要查询视图即可,无需关心底层的查询逻辑。
例如,假设我们有两个表:employees
表存储员工的基本信息,departments
表存储部门信息,并且通过 department_id
字段关联。如果我们经常需要查询每个员工所在的部门名称,每次都编写连接查询会很繁琐。这时可以创建一个视图来简化这个查询。
-- 创建 employees 表
CREATE TABLE employees (employee_id INT PRIMARY KEY,employee_name VARCHAR(100),department_id INT
);-- 创建 departments 表
CREATE TABLE departments (department_id INT PRIMARY KEY,department_name VARCHAR(100)
);-- 插入一些示例数据
INSERT INTO employees (employee_id, employee_name, department_id) VALUES
(1, '张三', 1),
(2, '李四', 2);INSERT INTO departments (department_id, department_name) VALUES
(1, '技术部'),
(2, '市场部');-- 创建视图
CREATE VIEW employee_department_view AS
SELECT e.employee_id, e.employee_name, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id;-- 查询视图
SELECT * FROM employee_department_view;
2.2 提高数据安全性
视图可以限制用户对数据的访问权限。通过创建视图,只向用户暴露他们需要的数据,而隐藏敏感信息。
比如,在一个包含员工工资信息的 employees
表中,工资信息是敏感数据,只有管理人员可以查看。我们可以创建一个不包含工资字段的视图,只允许普通员工查询基本信息。
-- 创建包含工资信息的 employees 表
CREATE TABLE employees (employee_id INT PRIMARY KEY,employee_name VARCHAR(100),salary DECIMAL(10, 2)
);-- 插入示例数据
INSERT INTO employees (employee_id, employee_name, salary) VALUES
(1, '张三', 5000),
(2, '李四', 6000);-- 创建不包含工资字段的视图
CREATE VIEW employee_basic_info_view AS
SELECT employee_id, employee_name
FROM employees;-- 普通员工只能查询视图
SELECT * FROM employee_basic_info_view;
2.3 数据独立性
视图可以为用户提供一种逻辑上的数据独立性。当底层表的结构发生变化时,只要视图的查询结果保持不变,用户的查询代码就不需要修改。
例如,假设原来的 employees
表中有 first_name
和 last_name
两个字段,我们创建了一个视图将这两个字段合并显示为 full_name
。后来,表结构发生了变化,将 first_name
和 last_name
合并为一个 full_name
字段。这时,只要我们修改视图的定义,用户查询视图的代码仍然可以正常使用。
-- 原始表结构
CREATE TABLE employees (employee_id INT PRIMARY KEY,first_name VARCHAR(50),last_name VARCHAR(50)
);-- 创建视图
CREATE VIEW employee_full_name_view AS
SELECT employee_id, CONCAT(first_name, ' ', last_name) AS full_name
FROM employees;-- 修改表结构
ALTER TABLE employees
DROP COLUMN first_name,
DROP COLUMN last_name,
ADD COLUMN full_name VARCHAR(100);-- 修改视图定义
CREATE OR REPLACE VIEW employee_full_name_view AS
SELECT employee_id, full_name
FROM employees;-- 用户查询视图的代码不变
SELECT * FROM employee_full_name_view;
三、MySQL 视图的语法
3.1 创建视图
创建视图的基本语法如下:
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}][DEFINER = {user | CURRENT_USER}][SQL SECURITY {DEFINER | INVOKER}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION];
3.1.1 各部分参数详细解释
-
CREATE
和OR REPLACE
:CREATE
:用于创建一个新的视图。如果视图已经存在,再次使用CREATE
会报错。OR REPLACE
:如果视图已经存在,则替换原有的视图;如果不存在,则创建新的视图。
-
ALGORITHM
:指定视图的处理算法,有三种可选值:UNDEFINED
:MySQL 会根据具体情况选择合适的算法。这是默认值。MERGE
:将视图的查询与外层查询合并执行。也就是说,当你查询视图时,MySQL 会把视图的查询语句和外层查询语句合并成一个新的查询语句,然后一起执行。这种算法通常适用于简单的视图,效率较高。TEMPTABLE
:先将视图的查询结果存储在临时表中,再对外层查询进行处理。这种算法适用于复杂的视图,因为它可以避免重复计算视图的查询结果,但会占用额外的临时存储空间。
-
DEFINER
:指定视图的定义者,默认为当前用户。可以指定为具体的用户,格式为'username'@'hostname'
。 -
SQL SECURITY
:指定视图的安全模式,有两种可选值:DEFINER
:使用定义者的权限执行视图查询。也就是说,无论谁查询这个视图,都会以定义者的权限来执行视图中的查询语句。INVOKER
:使用调用者的权限执行视图查询。即查询视图时,会以执行查询操作的用户的权限来执行视图中的查询语句。
-
view_name
:视图的名称,需要遵循 MySQL 标识符的命名规则。 -
column_list
:可选参数,指定视图的列名。如果不指定,视图的列名会与查询语句中的列名相同。 -
select_statement
:视图的查询语句,这是视图的核心部分,用于定义视图要显示的数据。 -
WITH CHECK OPTION
:可选参数,用于确保通过视图插入、更新或删除的数据符合视图的定义条件。CASCADED
和LOCAL
用于指定检查的范围:CASCADED
:会递归检查所有相关视图的条件。LOCAL
:只检查当前视图的条件。
3.1.2 创建视图示例
-- 创建一个简单的视图,使用默认参数
CREATE VIEW customer_view AS
SELECT customer_id, customer_name, email
FROM customers;-- 创建一个使用 OR REPLACE 的视图
CREATE OR REPLACE VIEW customer_view AS
SELECT customer_id, customer_name, email, phone
FROM customers;-- 创建一个指定 ALGORITHM 为 TEMPTABLE 的视图
CREATE ALGORITHM = TEMPTABLE VIEW customer_summary_view AS
SELECT COUNT(*) AS total_customers, AVG(age) AS average_age
FROM customers;
3.2 删除视图
删除视图的语法如下:
DROP VIEW [IF EXISTS] view_name;
IF EXISTS
:可选参数,如果视图不存在,不会抛出错误。view_name
:要删除的视图名称。
3.2.1 删除视图示例
-- 删除视图
DROP VIEW customer_view;-- 使用 IF EXISTS 删除视图
DROP VIEW IF EXISTS customer_summary_view;
3.3 修改视图
虽然 MySQL 没有专门的 MODIFY VIEW
语句,但可以使用 CREATE OR REPLACE VIEW
来修改视图的定义。
3.3.1 修改视图示例
-- 原视图定义
CREATE VIEW product_view AS
SELECT product_id, product_name
FROM products;-- 修改视图定义
CREATE OR REPLACE VIEW product_view AS
SELECT product_id, product_name, price
FROM products;
四、MySQL 视图中的函数使用
在视图的查询语句中,可以使用各种 MySQL 函数来处理数据。下面介绍几个常用的函数。
4.1 CONCAT()
函数
CONCAT()
函数用于将多个字符串连接成一个字符串。
-- 创建一个包含 CONCAT() 函数的视图
CREATE VIEW employee_full_name_view AS
SELECT employee_id, CONCAT(first_name, ' ', last_name) AS full_name
FROM employees;-- 查询视图
SELECT * FROM employee_full_name_view;
4.2 SUM()
函数
SUM()
函数用于计算指定列的总和。
-- 创建一个包含 SUM() 函数的视图,统计每个订单的总金额
CREATE VIEW order_total_view AS
SELECT order_id, SUM(quantity * price) AS total_amount
FROM order_items
GROUP BY order_id;-- 查询视图
SELECT * FROM order_total_view;
4.3 AVG()
函数
AVG()
函数用于计算指定列的平均值。
-- 创建一个包含 AVG() 函数的视图,计算每个部门员工的平均工资
CREATE VIEW department_avg_salary_view AS
SELECT department_id, AVG(salary) AS average_salary
FROM employees
GROUP BY department_id;-- 查询视图
SELECT * FROM department_avg_salary_view;
4.4 COUNT()
函数
COUNT()
函数用于统计记录的数量。
-- 创建一个包含 COUNT() 函数的视图,统计每个部门的员工数量
CREATE VIEW department_employee_count_view AS
SELECT department_id, COUNT(*) AS employee_count
FROM employees
GROUP BY department_id;-- 查询视图
SELECT * FROM department_employee_count_view;
五、对视图进行数据操作
5.1 插入数据
并不是所有的视图都支持插入数据,只有满足一定条件的视图才可以进行插入操作。视图必须满足以下条件:
- 视图的查询语句中不能包含
GROUP BY
、HAVING
、DISTINCT
等关键字。 - 视图的查询语句中必须包含所有非空且没有默认值的列。
-- 创建一个可插入数据的视图
CREATE VIEW insertable_employee_view AS
SELECT employee_id, employee_name, department_id
FROM employees;-- 向视图插入数据
INSERT INTO insertable_employee_view (employee_id, employee_name, department_id)
VALUES (3, '王五', 1);
5.2 更新数据
更新视图的数据和插入数据类似,也需要满足一定的条件。更新操作会直接影响基表中的数据。
-- 更新视图中的数据
UPDATE insertable_employee_view
SET employee_name = '赵六'
WHERE employee_id = 3;
5.3 删除数据
删除视图中的数据也会影响基表中的数据。同样,视图需要满足一定的条件才能进行删除操作。
-- 删除视图中的数据
DELETE FROM insertable_employee_view
WHERE employee_id = 3;
六、视图的性能考虑
6.1 索引的使用
虽然视图本身没有索引,但可以通过对基表创建索引来提高视图查询的性能。在创建视图时,如果视图的查询语句中涉及到条件过滤或排序操作,可以考虑在基表的相应列上创建索引。
-- 在 employees 表的 department_id 列上创建索引
CREATE INDEX idx_employees_department_id ON employees (department_id);
6.2 避免复杂的嵌套视图
过多的嵌套视图会增加查询的复杂度,降低查询性能。尽量避免创建过于复杂的嵌套视图,如果需要使用多个视图,可以考虑将它们合并或优化查询逻辑。
七、总结
视图是一个非常强大且实用的工具,它可以简化复杂查询、提高数据安全性和实现数据独立性。在实际应用中,我们需要根据具体的需求和数据特点,合理地使用视图,并注意视图的性能优化。
相关文章:
MySQL 视图入门
一、什么是 MySQL 视图 1.1 视图的基本概念 在 MySQL 中,视图是一种虚拟表,它本身并不存储实际的数据,而是基于一个或多个真实表(基表)的查询结果集。可以把视图想象成是一个预定义好的查询语句的快捷方式。当你查询…...

算法很美笔记(Java)——动态规划
解重叠子问题(当前解用到了以前求过的解) 形式:记忆型递归或递推(dp) 动态规划本质是递推,核心是找到状态转移的方式,也就是填excel表时的逻辑(填的方式),而…...
C++ ——继承
体现的是代码复用的思想 1、子类继承父类,子类就拥有了父类的特性(成员方法和成员属性) 2、已存在的类被称为“基类”或者“父类”或者“超类”;新创建的类被称为“派生类”或者“子类” 注意: (1&#…...
LeetCode 热题 100 283. 移动零
LeetCode 热题 100 | 283. 移动零 大家好,今天我们来解决一道经典的算法题——移动零。这道题在LeetCode上被标记为简单难度,要求我们将数组中的所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。下面我将详细讲解解题思路,…...

游戏引擎学习第116天
回顾昨天的工作 本次工作内容主要集中在游戏开发的低级编程优化,尤其是手动优化软件渲染。工作目的之一是鼓励开发者避免依赖外部库,而是深入理解代码并进行优化。当前阶段正进行SIMD(单指令多数据)优化,使用Intel推荐…...

react(9)-redux
使用CRA快速创建react项目 npx create-react-app react-redux 安装配套工具 npm i reduxjs/toolkit react-redux 启动项目 在创建项目时候会出现一个问题 You are running create-react-app 5.0.0, which is behind the latest release (5.0.1). We no longer support…...
Linux内核实时机制7 - 实时改造机理 - 软中断优化下
Linux内核实时机制7 - 实时改造机理 - 软中断优化下 https://blog.csdn.net/u010971180/article/details/145722641以下分别以Linux4.19、Linux5.4、Linux5.10、Linux5.15 展开分析,深入社区实时改造机理的软中断优化过程。https://blog.csdn.net/weixin_41028621/article/det…...

企业知识管理平台重构数字时代知识体系与智能服务网络
内容概要 现代企业知识管理平台的演进呈现出全生命周期管理与智能服务网络构建的双重特征。通过四库体系(知识采集库、加工库、应用库、评估库)的协同运作,该系统实现了从知识沉淀、结构化处理到价值释放的完整闭环。其中,知识图…...

大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(3)
Paimon的下载及安装,并且了解了主键表的引擎以及changelog-producer的含义参考: 大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(1) 利用Paimon表做lookup join,集成mysql cdc等参考: 大数据组件(四)快速入门实时数据…...

SVN把英文换中文
原文链接:SVN设置成中文版本 都是英文,换中文 Tortoise SVN 安装汉化教程(乌龟SVN) https://pan.quark.cn/s/cb6f2eee3f90 下载中文包...

Ubuntu 的RabbitMQ安装
目录 1.安装Erlang 查看erlang版本 退出命令 2. 安装 RabbitMQ 3.确认安装结果 4.安装RabbitMQ管理界面 5.启动服务并访问 1.启动服务 2.查看服务状态 3.通过IP:port 访问界面 4.添加管理员用户 a)添加用户名:admin,密码࿱…...

基于WebRTC与AI大模型接入EasyRTC:打造轻量级、高实时、强互动的嵌入式音视频解决方案
随着物联网和嵌入式技术的快速发展,嵌入式设备对实时音视频通信的需求日益增长。然而,传统的音视频解决方案往往存在体积庞大、实时性差、互动体验不佳等问题,难以满足嵌入式设备的资源限制和应用场景需求。 针对以上痛点,本文将介…...

QML 实现一个动态的启动界面
QML 实现一个动态的启动界面 一、效果查看二、源码分享三、所用到的资源下载 一、效果查看 二、源码分享 工程结构 main.qml import QtQuick import QtQuick.Controls import QtQuick.Dialogs import Qt.labs.platformWindow {id:windowwidth: 640height: 400visible: truetit…...
智能预警系统标准化处理流程
在当今数字化时代,IT系统的稳定运行对企业的业务连续性至关重要。为了及时发现和响应系统异常,构建智能预警系统已成为许多企业的当务之急。但仅仅拥有预警系统还不够,我们还需要一套标准化的处理流程,确保问题能够高效、有序地得到解决。 © ivwdcwso (ID: u012172506) 一…...
Unity游戏制作中的C#基础(4)数组声明和使用
一、数组的声明 在 C# 中,声明数组有多种方式,每种方式都有其适用的场景,下面为你逐一详细介绍: 1. 直接初始化声明 这种方式直观且便捷,在声明数组的同时就为其赋初值,让数组从诞生之初就拥有了具体的数据…...

tailwindcss学习03
01 入门 02 vue中接入 03 工具类优先 准备 vue.svg <svg viewBox"0 0 40 40" xmlns"http://www.w3.org/2000/svg"> <defs> <linearGradient x1"50%" y1"0%" x2"50%" y2"100%" id"a"&…...

QML Component 与 Loader 结合动态加载组件
在实际项目中,有时候我们写好一个组件,但不是立即加载出来,而是触发某些条件后才动态的加载显示出来,当处理完某些操作后,再次将其关闭掉; 这样的需求,可以使用 Component 包裹着组件ÿ…...
Visual studio 2022 将打开文件的方式由单击改为双击
1. 打开vs2022,选择Tools -> Options打开Options设置页面 2. 在左侧依次展开Environment, 选择Tabs and Windows 3. 在右侧面板往下拖拽滚动条,找到Preview Tab section, unchecked "Preview selected files in Solution Explorer (Altclick t…...

网络工程师 (49)UDP协议
前言 UDP协议,即用户数据报协议(User Datagram Protocol),是一种无连接的、不可靠的、面向报文的传输层通信协议。 一、基本特点 无连接性:UDP在发送数据之前不需要与目标设备建立连接,也无需在数据发送结束…...

了解大数据
一、大数据的特点: 1.大量 2.高速 3.多样 结构化数据和非结构化数据 4.低价值密度 二、大数据的应用场景:视频推荐、电商推荐等 三、大数据的技术发展脉络 阶段1:单机时代 阶段2:大数据时代-分布式处理 阶段3:实…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...

AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...