MySQL 视图入门

news2025/2/22 15:21:56

一、什么是 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_namelast_name 两个字段,我们创建了一个视图将这两个字段合并显示为 full_name。后来,表结构发生了变化,将 first_namelast_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 各部分参数详细解释
  • CREATEOR 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:可选参数,用于确保通过视图插入、更新或删除的数据符合视图的定义条件。CASCADEDLOCAL 用于指定检查的范围:

    • 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 BYHAVINGDISTINCT 等关键字。
  • 视图的查询语句中必须包含所有非空且没有默认值的列。
-- 创建一个可插入数据的视图
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 避免复杂的嵌套视图

过多的嵌套视图会增加查询的复杂度,降低查询性能。尽量避免创建过于复杂的嵌套视图,如果需要使用多个视图,可以考虑将它们合并或优化查询逻辑。

七、总结

视图是一个非常强大且实用的工具,它可以简化复杂查询、提高数据安全性和实现数据独立性。在实际应用中,我们需要根据具体的需求和数据特点,合理地使用视图,并注意视图的性能优化。

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

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

相关文章

【设计模式】 代理模式(静态代理、动态代理{JDK动态代理、JDK动态代理与CGLIB动态代理的区别})

代理模式 代理模式是一种结构型设计模式,它提供了一种替代访问的方法,即通过代理对象来间接访问目标对象。代理模式可以在不改变原始类代码的情况下,增加额外的功能,如权限控制、日志记录等。 静态代理 静态代理是指创建的或特…

《A++ 敏捷开发》- 16 评审与结对编程

客户:我们的客户以银行为主,他们很注重质量,所以一直很注重评审。他们对需求评审、代码走查等也很赞同,也能找到缺陷,对提升质量有作用。但他们最困惑的是通过设计评审很难发现缺陷。 我:你听说过敏捷的结对…

NutUI内网离线部署

文章目录 官网拉取源代码到本地仓库修改源代码打包构建nginx反向代理部署访问内网离线地址 在网上找了一圈没有写NutUI内网离线部署的文档,花了1天时间研究下,终于解决了。 对于有在内网离线使用的小伙伴就可以参考使用了 如果还是不会联系UP主:QQ:10927…

【实战篇】【深度介绍 DeepSeek R1 本地/私有化部署大模型常见问题及解决方案】

引言 大家好!今天我们来聊聊 DeepSeek R1 的本地/私有化部署大模型。如果你正在考虑或者已经开始了这个项目,那么这篇文章就是为你准备的。我们会详细探讨常见问题及其解决方案,帮助你更好地理解和解决在部署过程中可能遇到的挑战。准备好了…

Qt学习(六) 软件启动界面 ,注册表使用 ,QT绘图, 视图和窗口绘图,Graphics View绘图框架:简易CAD

一 软件启动界面 注册表使用 知识点1:这样创建的界面是不可以拖动的,需要手动创建函数来进行拖动,以下的3个函数是从父类继承过来的函数 virtual void mousePressEvent(QMouseEvent *event);virtual void mouseReleaseEvent(QMouseEvent *eve…

java练习(36)

ps:题目来自力扣 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 . 和 * 的正则表达式匹配。 . 匹配任意单个字符* 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 s 的,而不是部分字符串。 class Solution {publ…

【Linux网络编程】IP协议格式,解包步骤

目录 解析步骤 1.版本字段(大小:4比特位) 2.首部长度(大小:4比特位)(单位:4字节) 🍜细节解释: 3.服务类型(大小:8比特…

Unity 位图字体

下载Bitmap Font Generator BMFont - AngelCode.com 解压后不用安装直接双击使用 提前设置 1、设置Bit depth为32 Options->Export options 2、清空所选字符 因为我们将在后边导入需要的字符。 Edit->Select all chars 先选择所有字符 Edit->Clear all chars i…

Linux 网络与常用操作(适合开发/运维/网络工程师)

目录 OSI 七层协议简介 应用层 传输层 Linux 命令!!! 1. ifconfig 命令 简介 1. 查看网络地址信息 2. 指定开启、或者关闭网卡 3. 修改、设置 IP 地址 4. 修改机器的 MAC 地址信息 5. 永久修改网络设备信息 2. route 路由命令 …

linux 安装启动zookeeper全过程及遇到的坑

1、下载安装zookeeper 参考文章:https://blog.csdn.net/weixin_48887095/article/details/132397448 2、启动失败 1、启动失败JAVA_HOME is not set and java could not be found in PATH 已安装 JAVA 配置了JAVA_HOME,还是报错解决方法:参考&#xf…

MySQL数据库——表的约束

1.空属性(null/not null) 两个值:null(默认的)和not null(不为空) 数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办法…

ArcGIS Pro进行坡度与坡向分析

在地理信息系统中,坡度分析是一项至关重要的空间分析方法,旨在精确计算地表或地形的坡度,为地形特征识别、土地资源规划、环境保护、灾害预警等领域提供科学依据。本文将详细介绍如何利用ArcGIS Pro这一强大的地理信息系统软件,进…

【MySQL常见疑难杂症】MySQL数据库底层图例

● Connectors(连接者)​:指的是不同语言中与SQL的交互,从图3-1中可以看到目前流行的语言都支持MySQL客户端连接。 ● Connection Pool(连接池)​:管理缓冲用户连接、线程处理等需要缓存的需求。…

谈谈对线程的认识

面对这样的一个多核CPU时代, 实现并发编程是刚需. 多进程实现并发编程, 效果是特别理想的. 但是, 多线程编程模型有一个明显的缺点, 就是进程太重了, 效率不高. 创建一个进程, 消耗时间比较多. 销毁一个进程, 消耗时间也比较多. 调度一个进程, 消耗时间也比较多. 这里的时…

无人机遥控器接口作用详解!

USB接口: 功能:USB接口是一种通用串行总线接口,用于连接外部设备,如手机、平板、电脑或充电设备。在无人机遥控器上,USB接口通常用于数据传输和充电。 应用:用户可以通过USB接口将遥控器与电脑连接&#…

【数据分析】1 认识数据分析

一、课程核心内容结构 1. 课程定位 商业数据分析导论课:旨在为初学者奠定扎实的基础,介绍数据分析的基本概念、方法和应用场景。后续模块:包括职业发展路径、技能要求等深入内容,帮助学习者规划未来的职业道路。目标群体&#x…

ASP.NET Core 简单文件上传

使用异步 JavaScript 和 XML(AJAX)进行简单的文件上传;用 C# 编写的服务器端代码。 使用AJAX和ASP.NET Core MVC上传文件再简单不过了。这不依赖于jQuery。此代码允许上传多个文件,并与 .NET Core 3.1、.NET 6和.NET 8兼容。 如果…

量子计算驱动的金融衍生品定价革命:突破传统蒙特卡洛模拟的性能边界

引言:金融计算的算力困局 某国际投行采用128量子位处理器对亚洲期权组合定价时,其量子振幅估计算法在2.7秒内完成传统GPU集群需要68小时的计算任务。在蒙特卡洛路径模拟实验中,量子随机游走算法将10,000维衍生品的价格收敛速度提升4个数量级…

华为昇腾 910B 部署 DeepSeek-R1 蒸馏系列模型详细指南

本文记录 在 华为昇腾 910B(65GB) * 8 上 部署 DeepSeekR1 蒸馏系列模型(14B、32B)全过程与测试结果。 NPU:910B3 (65GB) * 8 (910B 有三个版本 910B1、2、3) 模型:DeepSeek-R1-Distill-Qwen-14B、DeepSeek…

Selenium实战案例2:东方财富网股吧评论爬取

上一篇文章,我们使用Selenium完成了网页内文件的自动下载,本文我们将使用Selenium来爬取东方财富网股吧内笔记的评论数据。 网页内容分析 网页内容的分析是web自动化中的关键一步。通过分析网页结构,我们可以确定需要抓取的数据位置以及操作元素的方式。…