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 避免复杂的嵌套视图

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

七、总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

npm在install时提示要安装python问题处理

使用npm\yarn\pnpm下载以来的时候,一直提示python异常,有的项目安装了python之后,下载依赖还是异常 而且旧版本项目使用python2,新的使用Python3…很烦 解决方案1:cnpm 使用cnpm 安装教程: npm安装cnpm,解…

浅谈网络 | 容器网络之Cilium

目录 Cilium介绍Cilium是什么Cilium 主要功能特性为什么用Cilium? 功能概述组件概况BPF 与 XDPeBPF (Extended Berkeley Packet Filter)XDP (eXpress Data Path) Cilium介绍 Cilium是什么 Cilium 是一个开源网络和安全项目,专为 Kubernetes、Docker 和…

前端知识点---vue的声明周期(vue)

文章目录 创建挂载更新销毁 vue的生命周期有四个阶段: 创建 挂载, 更新和销毁 创建 是vue组件从创建到准备渲染的过程 dom还没挂载到页面中 进行了初始化工作: 初始化数据(data,props) . 设置计算属性computed 初始化方法 methods 绑定事件watch 创建阶段的钩子函数beforeCrea…

MySQL如何解决幻读?

目录 一、什么是幻读? 1.1 幻读的定义 1.2 幻读的示例 1.3 幻读产生的原因? 1.4?读已提交(Read Committed) 1.4.1 确定事务等级 1.4.2 非锁定读取 准备 示例 结论 1.4.3 锁定读取 准备 示例 分析 结论 1.5?可重…

Day15-后端Web实战-登录认证——会话技术JWT令牌过滤器拦截器

目录 登录认证1. 登录功能1.1 需求1.2 接口文档1.3 思路分析1.4 功能开发1.5 测试 2. 登录校验2.1 问题分析2.2 会话技术2.2.1 会话技术介绍2.2.2 会话跟踪方案2.2.2.1 方案一 - Cookie2.2.2.2 方案二 - Session2.2.2.3 方案三 - 令牌技术 2.3 JWT令牌2.3.1 介绍2.3.2 生成和校…

支持所有模拟器根证书一键植入方便快捷

qq 点-我咨-】--询 群 Android系统中的安全证书分为“用户证书”和“系统证书”两类。用户可以在设备的设置 -> 安全 -> 查看安全证书页面中,分别查看“系统”和“用户”两个独立的证书列表。其中,用户证书通常是通过浏览器下载安装,或…

WinMerge深度解析:开源免费的文件与文件夹比较利器

在文件与文件夹比较工具中,WinMerge凭借其开源免费、功能全面的特点,赢得了广大用户的喜爱。本文将对WinMerge进行深度解析,帮助大家更好地了解这款工具。 一、开源免费,持续更新 WinMerge是一款专为Windows设计的开源免费文件与文件夹比较工具,自2000年诞生以来,至今已…

OpenCV形态学操作

1.1. 形态学操作介绍 初识: 形态学操作是一种基于图像形状的处理方法,主要用于分析和处理图像中的几何结构。其核心是通过结构元素(卷积核)对图像进行扫描和操作,从而改变图像的形状和特征。例如: 腐蚀&…

PHP旅游门票预订系统小程序源码

🌍 旅游门票预订系统:一站式畅游新体验,开启您的梦幻旅程 🌟 一款基于ThinkPHPUniapp精心雕琢的旅游门票预订系统,正翘首以待,为您揭开便捷、高效、全面的旅游预订新篇章!它超越了传统预订平台…

第8章作业

接口ip配置 r2 [r2]interface GigabitEthernet 0/0/0 [r2-GigabitEthernet0/0/0]ip address 13.0.0.3 24 [r2-GigabitEthernet0/0/0]interface GigabitEthernet 0/0/1 [r2-GigabitEthernet0/0/1]ip address 100.1.1.254 24 [r2-GigabitEthernet0/0/1]interface GigabitEthernet…

连续学习、增量学习有哪些应用场景?

游戏场景 在游戏环境中,智能体需要不断学习如何在复杂的环境中取得高分。例如: Atari游戏:智能体通过观察游戏画面(状态)并输出操作(动作)来玩游戏。由于游戏的动态性和复杂性,智能体…

java项目之学术成果管理系统源码(ssm+前端+mysql)

项目简介 学术成果管理系统实现了以下功能: 宠物医院信息管理系统的主要使用者分为管理员:个人中心、用户管理、医生管理、医学知识管理、科室信息管理、医生信息管理、预约挂号管理、医嘱信息管理、药品信息管理、订单信息管理、留言板管理、系统管理…

【Spring+MyBatis】_图书管理系统(下篇)

图书管理系统上篇、中篇如下: 【SpringMyBatis】_图书管理系统(上篇)-CSDN博客 【SpringMyBatis】_图书管理系统(中篇)-CSDN博客 目录 功能5:删除图书 6.1 约定前后端交互接口 6.2 后端接口 6.3 前端…

《STL 六大组件之容器探秘:深入剖析 string》

目录 一、string 类简介二、string 类的常用接口1. 构造函数(constructor function)2. 与容量相关的接口(capacity)3. 与迭代器有关的接口(iterator)4. 与元素访问有关的接口(element access&am…

深⼊理解指针(1)

1. 内存和地址 1.1 内存 我们知道计算机上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的 数据也会放回内存中。 那这些内存空间如何高效的管理呢? 其实也是 把内存划分为⼀个个的内存单元&…

解决element-ui的el-select使用filterable属性时,下拉框展开后,点击箭头图标收不回去问题

问题&#xff1a;当el-select下拉组件设置filterable属性时&#xff0c;下拉框展开后&#xff0c;再点击箭头图标下拉框收不回去了 解决方法&#xff1a; 在el-select标签上新增事件 visible-change“selectVisibleChange” focus"selectFocus"的处理 <el-select…

Es的text和keyword类型以及如何修改类型

昨天同事触发定时任务发现es相关服务报了一个序列化问题&#xff0c; 今天早上捕获异常将异常堆栈全部打出来看&#xff0c;才发现是聚合的字段不是keyword类型的问题。 到kibbna命令行执行也是一样的错误 使用 /_mapping查看索引的字段类型&#xff0c;才发现userUniqueid是te…

EasyExcel实现excel导入(模版上传)

目录 效果pom.xmlapplication.ymlcontrollerservice依赖类前台vue代码某个功能如果需要添加大量的数据,通过一条条的方式添加的方式,肯定不合理,本文通过excel导入的方式来实现该功能,100条数据导入成功85条,失败15条,肯定需要返回一个表格给前台或者返回1个错误excel给前…

BFS算法——层层推进,最短之路,广度优先搜索算法的诗意旅程(下)

文章目录 引言一. 迷宫中离入口最近的出口1.1 题目链接&#xff1a;https://leetcode.cn/problems/nearest-exit-from-entrance-in-maze/1.2 题目分析&#xff1a;1.3 思路讲解&#xff1a;1.4 代码实现: 二. 最小基因变化2.1 题目链接&#xff1a;https://leetcode.cn/problem…

Linux----Makefile基础

Makefile 是自动化构建工具 make 的配置文件&#xff0c;用于定义编译规则和依赖关系&#xff0c;实现高效增量编译。 初识makefile 1. 什么是 make&#xff1f; 定义&#xff1a; make 是一个命令行工具&#xff08;可执行程序&#xff09;&#xff0c;用于解析并执行 Makef…