MySQL中的视图(如果想知道MYSQL中有关视图的知识,那么只看这一篇就足够了!)

前言:视图(View)是数据库中一种虚拟的表,它通过封装复杂的查询简化数据操作,帮助用户更方便地访问数据。视图不仅提升了查询效率,还增强了数据安全性和逻辑独立性。


这里是的BLOG

想要了解更多内容可以访问我的主页-优快云博客

在正式开始讲解之前,先让我们看一下本文大致的讲解内容:

目录

1. 视图的概念

2.视图的创建

3.视图的使用

???(1)查询视图

? ? ? ? (2)连接查询

4.修改视图数据

? ? ? ? (1)通过真实表修改数据

? ? ? ? (2)通过视图修改数据

5.视图的删除

6.视图的优点

? ? ? ? (1)简单性

? ? ? ? (2)安全性

? ? ? ? (3)逻辑数据独立性

? ? ? ? (4)重命名列


1. 视图的概念

在开始正式学习视图之前,先让我们了解一下什么是MySQL中的视图,在关系型数据库中,视图(View)是一种虚拟的数据库对象,它是基于一个或多个基本表(或其他视图)的查询结果集构建的,并没有独立存储数据,每次查询视图时,数据库会根据视图定义中的 SELECT 语句重新生成数据,这意味着视图中的数据是动态的,依赖于底层表的数据。

MySQL中的视图为数据库提供了以下几种重要功能:

  • 简化复杂查询:视图可以将复杂的查询封装起来,用户不需要了解底层表结构,只需关注查询结果。
  • 数据安全性:视图可以控制用户对表中敏感数据的访问,仅暴露需要的数据列。
  • 逻辑数据独立性:当数据库的底层表结构发生变化时,只需要修改视图定义,而不需要修改应用程序的查询语句。

因此,视图是数据库设计中非常有用的工具,特别是在需要简化查询逻辑或增强数据安全性的时候。

2.视图的创建

在了解完了什么是MySQL中的视图之后,现在让我们开始学习一下如何在MySQL中去创建一个视图。

创建视图使用 CREATE VIEW法。语法结构如下:

CREATE VIEW view_name [(column_list)] AS select_statement;

其中的参数意思:

  • view_name:指定视图的名称。
  • column_list(可选):定义视图中列的名称。如果不提供,视图将自动使用 SELECT 语句中列的名称。
  • select_statement:视图的查询语句,这个查询决定了视图的内容,可以包括多表连接、聚合计算等。

这样我们就了解了如何在MySQL中去创建一个视图了,那么现在让我们使用一个案例来帮助你进一步进行理解:

例子:

假设我们有两个表:students(存储学生信息)和 scores(存储学生成绩),我们可以创建一个视图,展示每个学生的姓名和总成绩,以下是创建视图的 SQL 语句:

CREATE VIEW student_scores AS
SELECT s.name, SUM(sc.score) AS total_score  -- 计算每个学生的总成绩
FROM students s
JOIN scores sc ON s.id = sc.student_id  -- 将学生表与成绩表连接
GROUP BY s.name;  -- 按照学生姓名分组

代码解释

  • SUM(sc.score):我们对每个学生的成绩进行求和,得到总成绩。
  • JOIN scores sc ON s.id = sc.student_id:通过 JOIN 连接 students 表和 scores 表,条件是学生的 id 和成绩表中的 student_id 匹配。
  • GROUP BY s.name:按学生姓名分组,从而计算每个学生的总成绩。

——至此,我们就大致的了解了如何在MySQL中创建一个视图了!!!

3.视图的使用

了解完了视图的创建之后,在让我们学习一下如何在MySQL中去使用视图,这里我们介绍两个:查询视图和连接查询

(1)查询视图

查询视图就像查询普通表一样,语法与查询表相同。例如,查询 student_scores 视图中的所有学生及其总成绩:

SELECT * FROM student_scores;

代码解释

  • SELECT * FROM student_scores:这将返回 student_scores 视图中所有学生的姓名和总成绩。

这样我们就学会了如何去查询视图了!!!

(2)连接查询

视图也可以与其他表进行连接查询。例如,假设我们还有一个 classes 表,存储学生所在班级的信息,如果我们想要查询每个学生的姓名、总成绩和班级名称,可以将视图与 classes 表连接,使用以下 SQL 语句:

SELECT ss.name, ss.total_score, c.class_name
FROM student_scores ss
JOIN classes c ON ss.name = c.student_name;  -- 将视图与班级表连接

代码解释

  • JOIN classes c ON ss.name = c.student_name**:通过学生姓名将** student_scores 视图与 classes 表进行连接,从而查询每个学生的班级信息。
  • SELECT ss.name, ss.total_score, c.class_name**:返回学生姓名、总成绩和班级名称。**

这样我们就学会了如何去连接查询了!!!

4.修改视图数据

当然,视图不仅可以查询数据,还可以用于修改数据。然而,并不是所有视图都支持更新操作,只有在满足以下条件时,视图才允许数据更新:

  • 视图基于单一表。
  • 视图没有使用聚合函数、DISTINCT、GROUP BY、UNION 等。
  • 视图查询中的列来自一个可更新的表。

那么接下来我们将会从通过真实表和通过视图两种方式进行讲解如何去修改数据。

(1)通过真实表修改数据

通过底层表进行的数据修改会自动反映在视图中,例如,假设我们想要修改 students 表中某个学生的姓名:

UPDATE students SET name = 'New Name' WHERE id = 1;

代码解释

  • 该语句更新 students 表中的学生姓名,id 为 1 的学生的姓名将被修改为 New Name
  • 如果 student_scores 视图基于该表,视图中的数据也会反映这一更新。

——这就是通过真实表修改数据了!!!

(2)通过视图修改数据

某些情况下,我们可以通过视图直接修改数据,但如果视图使用了聚合函数、DISTINCT、GROUP BY 或 UNION 等操作,则视图通常是不可更新的,例如,以下视图由于使用了聚合函数 SUM(),因此不可更新:

CREATE VIEW view_with_aggregation AS
SELECT s.name, SUM(sc.score) AS total_score
FROM students s
JOIN scores sc ON s.id = sc.student_id
GROUP BY s.name;  -- 使用了聚合函数,无法更新

代码解释

  • SUM(sc.score):聚合函数 SUM() 计算学生的总成绩,这使得视图成为只读视图。
  • 由于使用了 GROUP BY,我们不能通过该视图直接更新数据。

——这就是通过视图修改数据了!!!

5.视图的删除

视图既然能创建出来,那么就可以进行删除,那么在MySQL中我们如何去删除一个视图呢?当我们不再需要某个视图,可以使用 DROP VIEW 语句删除它。语法如下:

DROP VIEW view_name;

例如,删除 student_scores 视图:

DROP VIEW student_scores;

代码解释

  • DROP VIEW student_scores:此语句会删除 student_scores 视图。需要注意的是,删除视图不会影响底层表的数据,只是删除视图的定义。

这样我们就学会了如何在MySQL中去删除一个视图了!!!

6.视图的优点

通过以上对视图的学习,我们已经对MySQL中的视图有了一定的了解了,那么读者可能会想,我们为什么要去使用视图呢?或者说视图到底有什么好处呢?有的有的,兄弟,视图大致有以下四种好处:

(1)简单性

视图的最大优势之一是简化复杂查询,对于那些包含多个 JOIN、聚合或筛选条件的复杂查询,视图可以将其封装为一个简单的查询接口,用户只需要查询视图,而不需要了解其具体实现,例如,我们可以将计算学生成绩总和的复杂查询封装为一个视图:

-- 创建一个名为 student_scores 的视图
CREATE VIEW student_scores AS
-- 从学生表和成绩表中选择学生姓名和总分
SELECT s.name, SUM(sc.score) AS total_score
-- 从 students 表和 scores 表中进行连接
FROM students s
JOIN scores sc ON s.id = sc.student_id
-- 按照学生姓名进行分组
GROUP BY s.name;

(2)安全性

视图能够增强数据库的安全性,特别是在处理敏感数据时,通过视图,我们可以限制用户只能访问表中的部分数据,例如,我们可以隐藏学生的身份证号或其他敏感信息,只暴露学生的姓名和成绩:

-- 创建一个名为 secure_student_scores 的视图
CREATE VIEW secure_student_scores AS
-- 从学生表和成绩表中选择学生姓名和总分
SELECT s.name, SUM(sc.score) AS total_score
-- 从 students 表和 scores 表中进行连接
FROM students s
JOIN scores sc ON s.id = sc.student_id
-- 按照学生姓名进行分组
GROUP BY s.name;

(3)逻辑数据独立性

视图提供了很好的逻辑数据独立性,当底层表结构发生变化时,只需修改视图的定义,而无需修改应用程序中的查询,例如,如果学生表的字段发生变化,我们只需要调整视图定义,而不需要改变应用程序中的查询逻辑:

-- 创建一个名为 updated_student_info 的视图
CREATE VIEW updated_student_info AS
-- 从学生表和班级表中选择学生ID、姓名和班级名称
SELECT s.student_id, s.name, c.class_name
-- 从 students 表和 classes 表中进行连接
FROM students s
JOIN classes c ON s.id = c.student_id;

(4)重命名列

视图允许我们对列进行重命名,这可以使数据结果更具可读性。例如,重命名 students 表中的 id 列,使得列名更加直观:

-- 创建一个名为 renamed_student_view 的视图
CREATE VIEW renamed_student_view AS
-- 从 students 表中选择学生ID和姓名,并为这些字段重命名
SELECT s.id AS student_id, s.name AS student_name
-- 从 students 表中选择数据
FROM students s;

通过上述的描述与例子,我们就可以大致的了解在MySQL中使用视图的好处了,总的来说,视图是数据库中非常强大且有用的工具,它允许开发者通过封装复杂的查询来简化数据的使用和访问,并且视图不仅提高了数据库查询的效率,还增强了数据的安全性,并提供了逻辑数据独立性。


以上就是本篇文章全部内容~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值