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_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.rhkb.cn/news/23288.html

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

相关文章

C语言【指针篇】(一)

前言 指针基础概念理解,从底层出发理解指针 C语言【指针篇】(一) 前言正文1. 内存和地址1.1 内存1.2 究竟该如何理解编址 2. 指针变量和地址2.1 取地址操作符(&)2.2 指针变量和解引用操作符(*)2.3 指针变量的大小 3. 指针变量类型的意义…

【每日八股】Redis篇(二):数据结构

Redis 数据类型? 主要有 STRING、LIST、ZSET、SET 和 HASH。 STRING String 类型底层的数据结构实现主要是 SDS(简单动态字符串),其主要应用场景包括: 缓存对象:可以用 STRING 缓存整个对象的 JSON&…

文章精读篇——用于遥感小样本语义分割的可学习Prompt

题目:Learnable Prompt for Few-Shot Semantic Segmentation in Remote Sensing Domain 会议:CVPR 2024 Workshop 论文:10.48550/arXiv.2404.10307 相关竞赛:https://codalab.lisn.upsaclay.fr/competitions/17568 年份&#…

游戏引擎学习第119天

仓库:https://gitee.com/mrxiao_com/2d_game_3 上一集回顾和今天的议程 如果你们还记得昨天的进展,我们刚刚完成了优化工作,目标是让某个程序能够尽可能快速地运行。我觉得现在可以说它已经快速运行了。虽然可能还没有达到最快的速度,但我们…

HybridCLR+Adressable+Springboot热更

本文章会手把手教大家如何搭建HybridCLRAdressableSpringboot热更。 创作不易,动动发财的小手点个赞。 安装华佗 首先我们按照官网的快速上手指南搭建一个简易的项目: 快速上手 | HybridCLR 注意在热更的代码里添加程序集。把用到的工具放到程序集里…

多无人机协同路径规划(论文+仿真)

在现代技术的快速发展下,飞行器的种类也越来越多了,他们的应用场景和应用功能也越来越完善和复杂。举例来说,ps-x625型号就是大疆无人机生产的就是在植物保护方面有很好的应用,宝鸡的兴义生产的X8型号无人机在航空领域有很大突破&…

CentOS环境变量配置+解析

环境变量的作用就是让系统快速通过你的命令找到你的可执行程序,windows系统里也同理,也就是你每次输入个命令,系统就会找环境变量里到底有没有叫这个命令进程的 一、环境变量配置 1.编辑配置文件 vim /etc/profile export PATH$PATH:$JAVA…

einops测试

文章目录 1. einops2. code3. pytorch 1. einops einops 主要是通过爱因斯坦标记法来处理张量矩阵的库,让矩阵处理上非常简单。 conda : conda install conda-forge::einopspython: 2. code import torch import torch.nn as nn import torch.nn.functional as…

Unity教程(二十一)技能系统 基础部分

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程(零)Unity和VS的使用相关内容 Unity教程(一)开始学习状态机 Unity教程(二)角色移动的实现 Unity教程(三)角色跳跃的实现 Unity教程&…

Docker:Docker从入门到精通(一)- Docker简介

一、前言 通过本专栏的学习,我们将了解   1. 掌握Docker基础知识,能够理解Docker镜像与容器的概念   2. 完成Docker安装与启动   3. 掌握Docker镜像与容器相关命令   4. 掌握Tomcat Nginx 等软件的常用应用的安装   5. 掌握docker迁移与备份相…

单机上使用docker搭建minio集群

单机上使用docker搭建minio集群 1.集群安装1.1前提条件1.2步骤指南1.2.1安装 Docker 和 Docker Compose(如果尚未安装)1.2.2编写docker-compose文件1.2.3启动1.2.4访问 2.使用2.1 mc客户端安装2.2创建一个连接2.3简单使用下 这里在ubuntu上单机安装一个m…

Image Downloader下载文章图片的WordPress插件

源码介绍 一个用于下载图片的WordPress插件,包含下载统计功能,支持任何主题使用 用户点击下载后自动打包该文章所有原始图片,并把文章标题作为压缩包的文件名。 不占用服务器空间,也不占网盘空间,直接利用浏览器的性…

PLC通讯

PPI通讯 是西门子公司专为s7-200系列plc开发的通讯协议。内置于s7-200 CPU中。PPI协议物理上基于RS-485口,通过屏蔽双绞线就可以实现PPI通讯。PPI协议是一种主-从协议。主站设备发送要求到从站设备,从站设备响应,从站不能主动发出信息。主站…

VScode+stfp插件,实现文件远程同步保存【2025实操有效】

目录 1 痛点2 准备工作3 操作步骤3.1 第一步,下载STFP插件3.2 第二步,修改配置文件3.3 第三步,测试是否成功 4 后记 1 痛点 我一直用vscode远程连接服务器,传代码文件等到服务器上面,突然有一次服务器那边尽心维修&am…

【quicker】调节PPT指定字号字体大小/快速调节WPS的PPT字体大小

在quicker的拓展动作中找不到直接指定字号大小方式的动作。 换个思路,既然无法通过alt键模拟,不如模拟右键菜单触发?尝试过失败了 所以有了第三种方法 ,首先给字体窗口设置快捷键,此处设置的是altshiftf,然…

Grouped-Query Attention(GQA)详解: Pytorch实现

Grouped-Query Attention(GQA)详解 Grouped-Query Attention(GQA) 是 Multi-Query Attention(MQA) 的改进版,它通过在 多个查询头(Query Heads)之间共享 Key 和 Value&am…

百度百舸 DeepSeek 一体机发布,支持昆仑芯 P800 单机 8 卡满血版开箱即用

在私有云环境中成功部署 DeepSeek 满血版并实现性能调优,并不是一件容易的事情。选择合适的 GPU 配置、安装相应的环境、成功部署上线业务、加速推理任务加速、支撑多用户并发 …… 完成业务测试,成功融入生产业务中。 为了帮助企业快速实现 DeepSeek 服…

c++入门-------命名空间、缺省参数、函数重载

C系列 文章目录 C系列前言一、命名空间二、缺省参数2.1、缺省参数概念2.2、 缺省参数分类2.2.1、全缺省参数2.2.2、半缺省参数 2.3、缺省参数的特点 三、函数重载3.1、函数重载概念3.2、构成函数重载的条件3.2.1、参数类型不同3.2.2、参数个数不同3.2.3、参数类型顺序不同 前言…

tortoiseGit的使用和上传拉取

tortoiseGit的使用和上传拉取 下载TortoiseGit 通过网盘分享的文件:tortoiseGit.zip 链接: https://pan.baidu.com/s/1EOT_UsM9_OysRqXa8gES4A?pwd1234 提取码: 1234 在电脑桌面新建文件夹并进入 右击鼠标 将网址复制上去 用户名和密码是在git注册的用户名和…

Mybatis学习总结

官网 概念 用于简化JDBC的开发。 在配置mybatis的时候如果没有建立连接识别不了信息,我们需要在idea配置mysql的配置信息 JDBC是一套操作关系数据库的API,有效率,和mybatis比起来资源节约,性能高,不繁琐。 数据库连…