跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
SQL

MySQL 视图、用户与权限管理

MySQL 数据库的核心概念与管理操作。首先讲解了视图的定义、创建、修改及删除方法,阐述了视图在简化复杂查询、保护数据安全及提供逻辑独立性方面的优点。其次说明了如何查看、创建、修改密码及删除数据库用户,强调了主机限制的重要性。最后涵盖了权限管理,包括查看、添加和回收用户权限的具体语法与示例,指出应使用 root 用户进行权限操作以确保安全。

活在当下发布于 2026/3/28更新于 2026/9/963 浏览
MySQL 视图、用户与权限管理

文章配图

一、视图

当我们需要多次使用同一个复杂的 SQL 语句进行查询时,可以使用视图来对 SQL 语句进行封装,以此简化语句。

1.1 什么是视图

视图是由 SELECT 语句定义的虚拟表,它的结构和数据来源于底层的基表。视图中存储的其实是查询语句,当用户访问视图时,数据库会执行该查询语句,从基表中提取数据并返回结果。用户可以像操作普通表一样使用视图进行查询、更新、管理。

文章配图

例如上述 SQL 语句是一个 4 张表联合查询的语句,如此复杂的语句就可以使用视图进行封装,对 SQL 语句进行简化。

1.2 创建视图

创建视图语法:

CREATE VIEW view_name [(column_list)] AS select_statement;

测试数据:查询 MySQL 成绩比 Java 成绩好的同学。

mysql> SELECT DISTINCT * FROM student s, score s1, score s2, course c1, course c2 
WHERE s.id = s1.student_id AND s.id = s2.student_id 
AND s1.course_id = c1.id AND s2.course_id = c2.id 
AND c1.name = 'Java' AND c2.name = 'MySQL' AND s1.sco < s2.sco;

为了简化复杂 SQL 语句,我们可以使用视图进行包装:

-- 创建视图
CREATE VIEW v_Java_or_MySQL AS 
SELECT DISTINCT s.id, s.name, s1.sco AS java_sco, s2.sco AS mysql_sco 
FROM student s, score s1, score s2, course c1, course c2 
WHERE s.id = s1.student_id AND s.id = s2.student_id 
AND s1.course_id = c1.id AND s2.course_id = c2.id 
AND c1.name = 'Java' AND c2.name = 'MySQL' AND s1.sco < s2.sco;

-- 查询视图
mysql> SELECT * FROM v_Java_or_MySQL;

查询学生的姓名和总分(隐藏学号和各科成绩):

-- 直接使用真实表查询
mysql> SELECT s.name, SUM(sc.sco) FROM student s, score sc WHERE s.id = sc.student_id GROUP BY s.name;

-- 使用视图
CREATE VIEW v_total AS SELECT s.name, SUM(sc.sco) FROM student s, score sc WHERE s.id = sc.student_id GROUP BY s.name;
SELECT name FROM v_total;

如果直接使用真实表进行查询,想要查看什么信息就只需要加上需要查看的字段即可。但是假设现在是一个银行系统,如果能够这样随机查看想要查看的内容,那么就没有办法保证信息的安全性了。视图可以隐藏表中的敏感数据。

视图还可以与真实表进行表连接查询:

mysql> SELECT * FROM student, v_total WHERE student.name = v_total.name;

1.3 修改数据

对真实表的数据进行修改,会影响视图,是因为视图的本质并没有保存数据,可以理解为保存的是查询语句。当我使用视图时就会调用保存的查询语句返回结果,所以真实表的数据不管怎么变,我每一次使用视图都是一次新的查询。

将孙悟空的 Java 成绩修改为 99 分:

-- 修改成绩
UPDATE score SET sco = 99 WHERE student_id = (SELECT student.id FROM student WHERE name = '孙悟空') 
AND course_id = (SELECT course.id FROM course WHERE name = 'Java');

不仅通过真实表修改数据会影响视图,通过视图修改数据也会影响到基表:

-- 创建视图
CREATE VIEW v_java_sco AS 
SELECT student.id, student.name AS '学生姓名', student.sno, course.name AS '课程名称', score.sco 
FROM student, score, course 
WHERE student.id = score.student_id AND course.id = score.course_id 
AND student.name = '孙悟空' AND course.name = 'Java';

-- 通过视图修改数据
UPDATE v_java_sco SET sco = 60;

但是不是所有的视图都可以进行修改的:

具有以下条件的视图不可以修改:

  • 创建视图时使用聚合函数
  • 创建视图时使用 DISTINCT
  • 创建视图使用 GROUP BY 以及 HAVING 子句
  • 创建视图使用 UNION 或者 UNION ALL
  • 查询列表使用子查询在 FROM 子句中引用不可更新的视图

所以通过视图修改数据的情况是很苛刻的,大部分情况下我们还是直接修改真实表即可。

1.4 删除视图

删除视图语法:

DROP VIEW view_name;

删除刚才创建的所有视图:

-- 查看创建的视图
SHOW TABLES;

-- 删除视图
DROP VIEW v_Java_or_MySQL, v_java_sco, v_total;

1.5 视图的优点

  • 简单性:视图可以将复杂的 SQL 语句进行封装,变成一个简单的查询语句。
  • 安全性:视图可以隐藏表中的敏感数据,比如上面举的银行的例子。
  • 逻辑数据独立性:即使底层表结构发生变化,只需要修改视图定义,不需要修改依赖视图的应用程序,使用到应用程序与数据库的解耦合。
  • 重命名列:视图允许用户重命名列,增强数据可读性。

二、用户

数据库服务安装完成后会存在一个默认的 root 用户(超级管理员),该用户拥有最高权限可以操纵和管理所有数据库。但是此时我们只希望某个用户操纵和管理当前应用对应的数据库,而不能操纵和管理其他的数据库,这个时候我们就需要为当前数据库添加一个用户并指定用户的权限。

文章配图

对于上图中的用户来说,root 用户可以操纵所有的数据库,普通用户分别可以操纵 DB1 和 DB3,而只读用户分别只能访问 DB3 和 DB4。

2.1 查看用户

在 MySQL 中,用户的信息保存在系统数据库中的 user 表中,通过 SELECT 语句进行查看:

mysql> USE mysql;
mysql> SHOW TABLES;
mysql> SELECT host, user, authentication_string FROM user;
  • host:表示谁可以登录。
  • user:表示用户名。
  • authentication_string:表示加密后的用户密码。

2.2 创建用户

创建用户语法:

CREATE USER 'user_name'@'host_name' IDENTIFIED BY 'auth_string';
  • 'user_name'@'host_name' 是一个用户描述的方式。
  • 'user_name' 部分就是用来登录 MySQL 的用户名。
  • 'host_name' 部分是可以登录的主机名或者 IP,只有指定的机器才能访问当前 MySQL。如果不指定 host_name 相当于 'user_name'@'%' 表示所有主机都可以连接到数据库,这样可能会导致安全问题。
  • 'auth_string' 是密码的明文。
  • host_name 可以通过子网掩码设置主机范围,比如 192.168.10.1/24。

创建用户:

mysql> CREATE USER 'sunny'@'localhost' IDENTIFIED BY '8888';

创建一个新用户,允许从 192.168.10.1/24 网段登录:

-- 创建用户
CREATE USER 'rain'@'192.168.10.1/24' IDENTIFIED BY '666';

创建完成后,使用新用户登录试试:

# 成功登录示例
mysql -usunny -p

# 失败示例(IP 不在允许网段)
mysql -urain -p
ERROR 1045 (28000): Access denied for user 'rain'@'localhost'

2.3 修改密码

修改密码语法:

-- 方法 1
ALTER USER 'user_name'@'host_name' IDENTIFIED BY 'auth_string';
-- 方法 2
SET PASSWORD FOR 'user_name'@'host_name' = 'auth_string';
-- 为当前用户设置密码
SET PASSWORD = 'auth_string';

以 root 超级管理员身份登录,为 'sunny'@'localhost' 用户设置密码:

-- 修改密码
ALTER USER 'sunny'@'localhost' IDENTIFIED BY '6';

2.4 删除用户

删除用户语法:

DROP USER 'user_name'@'host_name';

删除刚才创建的 rain 用户:

mysql> DROP USER 'rain'@'192.168.10.1/24';

三、权限

用户创建好之后,我们需要给用户赋予一些专属的权限。其中 ALL 表示所有的权限,root 管理员则拥有这样的权限。

文章配图

对于刚创建的用户是没有任何权限的:比如 sunny 用户。

3.1 查看当前用户权限

查看语法:

SHOW GRANTS FOR 'user_name'@'host_name';

查看 sunny 用户拥有的权限:

mysql> SHOW GRANTS FOR 'sunny'@'localhost';

USAGE 表示没有任何权限。

3.2 添加权限

添加权限语法:

GRANT priv_type ON priv_level TO 'user_name'@'host_name';
  • priv_type:权限类型。
  • priv_level:* | *.* | db_name.* | db_name.tbl_name | tbl_name。*.* 表示所有数据库下的所有表。

为 sunny 用户授权于查看 test 数据的权限:

-- 授予权限
GRANT SELECT ON test.* TO 'sunny'@'localhost';

-- 查看权限
SHOW GRANTS FOR 'sunny'@'localhost';

为 sunny 用户授权 test 数据库所有权限:

mysql> GRANT ALL ON test.* TO 'sunny'@'localhost';

3.3 回收权限

能够为用户授予权限,当前也能够回收权限啦,回收权限语法:

REVOKE priv_type ON priv_level FROM 'user_name'@'host_name';

回收 sunny 用户的对于 test 数据库的权限:

mysql> REVOKE ALL ON *.* FROM 'sunny'@'localhost';

注意事项: 给用户赋予权限和收回权限时都需要注意当前用户是否有赋予其他用户权限的能力和收回其他用户权限的能力,所以当我们最好使用 root 超级管理员来对其他用户进行操作。

文章配图

目录

  1. 一、视图
  2. 1.1 什么是视图
  3. 1.2 创建视图
  4. 1.3 修改数据
  5. 1.4 删除视图
  6. 1.5 视图的优点
  7. 二、用户
  8. 2.1 查看用户
  9. 2.2 创建用户
  10. 成功登录示例
  11. 失败示例(IP 不在允许网段)
  12. 2.3 修改密码
  13. 2.4 删除用户
  14. 三、权限
  15. 3.1 查看当前用户权限
  16. 3.2 添加权限
  17. 3.3 回收权限

更多推荐文章

查看全部
  • Everything Claude Code:Claude Code 配置集合与 AI 开发工作流
  • LightRAG 本地部署与 WebUI 实战指南
  • VS Code 安装 GitHub Copilot 实现 AI 辅助编程
  • Flutter 三方库 modular_core 在鸿蒙 HarmonyOS 上的架构适配与依赖注入实践
  • 高鋒集團與 Web3Labs:以資本與生態賦能傳統企業 Web3 轉型
  • Git 远程操作与标签管理
  • 网络安全渗透测试常用术语详解:50 个核心概念解析
  • 最长递增子序列:动态规划与贪心解法
  • 深度解析 KBQA 常用数据集:WebQSP 与 CWQ
  • Spring Boot 药品进销存信息管理系统设计与实现
  • ToDesk 内置 ToClaw AI 实现科技新闻日报自动化实战
  • AI 辅助开发 SpringBoot 在线图书借阅平台实践
  • C++ 语法基础:STL、位运算与常用库函数
  • Whisper-large-v3-turbo 实现 8 倍速语音转文字指南
  • 红黑树封装 map 和 set 的实现原理与代码
  • 深入理解 IDE 中 LLM 调用的 Session 机制
  • C++ 红黑树原理与代码实现
  • Spring 加载 XML 配置文件的六种常用方式
  • 基于 SpringBoot 的流浪动物救助收养系统设计与实现
  • AIGC已经不是未来,而是现在:2025年最值得关注的6大趋势!

相关免费在线工具

  • SQL 美化和格式化

    在线格式化和美化您的 SQL 查询(它支持各种 SQL 方言)。 在线工具,SQL 美化和格式化在线工具,online

  • SQL转CSV/JSON/XML

    解析 INSERT 等受限 SQL,导出为 CSV、JSON、XML、YAML、HTML 表格(见页内语法说明)。 在线工具,SQL转CSV/JSON/XML在线工具,online

  • CSV 工具包

    CSV 与 JSON/XML/HTML/TSV/SQL 等互转,单页多 Tab。 在线工具,CSV 工具包在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online