MySQL入门实战:视图+用户权限管理使用方法(图文+代码)

 更新时间:2026年04月25日 08:52:14   作者:草莓熊Lotso  
本文详细介绍了MySQL的视图和用户权限管理,视图是虚拟表,不存储数据,数据来源于基表,视图和基表数据双向联动,用户管理与权限控制方面,最小权限原则、登录限制、禁止root远程登录和按业务分用户是生产环境的最佳实践,正确总结了视图和用户管理的核心知识点

在日常开发和面试中,视图用户权限管理是 MySQL 最基础也最容易被忽视的两个核心模块:很多新手只会用基础的增删改查,生产环境直接用 root 账号操作所有库,视图乱用导致业务 bug 和性能问题,最终引发数据安全风险。本文从核心定义、基础语法、实战案例到使用限制,全流程拆解,面试、开发、运维一套搞定。

一. MySQL 视图(View)全解

1.1 视图的核心本质

视图是一张虚拟表,其内容由 select 查询语句定义。和真实的业务表一样,视图包含带名称的列和行数据,但它本身不存储任何真实数据,数据全部来自视图定义时依赖的底层基表。

视图和基表的数据是强关联的:

  • 视图的数据修改,会直接影响底层基表;
  • 基表的数据修改,也会实时同步反映到视图中。

它的核心价值在于:

  • 简化复杂的多表关联查询,一次定义多次复用;
  • 实现行列级别的数据权限控制,屏蔽敏感字段;
  • 屏蔽底层表结构的变化,对外提供统一的查询接口。

1.2 视图的基础使用

我们以经典的员工表emp、部门表dept为案例,完整演示视图的创建、查询、修改、删除全流程,和参考文档案例完全对齐。

1.2.1 创建视图

基础语法

create view 视图名 as select查询语句;

实战案例:创建员工姓名 + 部门名称的关联视图,屏蔽员工薪资、编号等敏感字段

-- 创建视图v_ename_dname,关联员工表和部门表
create view v_ename_dname as
select ename, dname
from emp, dept
where emp.deptno = dept.deptno;

1.2.2 查询视图

视图的查询语法和普通表完全一致,支持排序、筛选、聚合等所有 select 操作

-- 基础查询
select * from v_ename_dname;

-- 带排序的查询
select * from v_ename_dname order by dname;

1.2.3 视图与基表的双向数据联动

这是视图最核心的特性,参考文档中重点强调了视图和基表的互相影响,我们通过案例完整演示。
① 修改视图,影响基表

-- 修改视图中的员工姓名
update v_ename_dname set ename='test' where ename='clark';

-- 查询基表,数据已被同步修改
select * from emp where ename='clark';
select * from emp where ename='test';

② 修改基表,影响视图

-- 修改基表中员工的部门编号
update emp set deptno=10 where ename='james';

-- 查询视图,部门名称已同步更新
select * from v_ename_dname where ename='james';

1.2.4 删除视图

drop view 视图名;

-- 示例:删除刚才创建的视图
drop view v_ename_dname;

1.3 视图的使用规则与限制

  • 命名唯一性:视图名必须和库内其他视图、表名唯一,不能重名;
  • 创建数量无限制:可以基于业务创建任意数量的视图,但要注意复杂嵌套查询的视图会严重影响性能;
  • 索引与触发器限制:视图不能创建索引,也不能关联触发器、设置默认值;
  • 权限要求:视图的使用需要对应的访问权限,创建视图必须有查询基表的权限;
  • 排序覆盖规则:视图定义中可以使用 order by,但如果从该视图查询的 select 语句中也包含 order by,视图中的排序会被外部的排序覆盖;
  • 混合使用:视图可以和普通业务表一起进行关联查询、嵌套查询;
  • 更新限制:只有简单的单表视图支持 update/insert/delete,多表关联、聚合函数、分组、去重的视图无法直接更新。

二. MySQL 用户管理与权限控制

2.1 为什么必须做用户管理?

核心痛点:生产环境直接使用 root 用户存在极大的安全隐患。

  • root 账号拥有 MySQL 的最高权限,误操作drop database会直接导致全库数据丢失;
  • 多业务、多人员共用 root 账号,无法做权限隔离和操作审计;
  • 一旦 root 账号泄露,整个 MySQL 实例的所有数据都会完全失控。

正确的做法是:按业务、按人员创建独立用户,只分配最小必要权限。 比如张三只能操作 mytest 库,李四只能操作 msg 库,互不影响,风险可控。

2.2 MySQL 用户的核心存储(查询系统用户以及核心字段解释)

MySQL 中的所有用户信息,都存储在系统数据库mysqluser表中,这是用户管理的核心。

查询系统用户

-- 切换到mysql系统库
use mysql;

-- 查询核心用户信息
select host, user, authentication_string from user;

核心字段解释

字段核心含义
host允许该用户登录的主机地址:localhost表示仅本机登录,%表示允许任意地址远程登录,也可以指定固定 IP
user用户名
authentication_string经过 password 函数加密后的用户密码,明文密码无法直接存储
xxx_priv一系列权限字段,记录该用户拥有的全局权限

2.3 用户的核心操作(创建、删除、修改密码)

2.3.1 创建用户

基础语法

create user '用户名'@'登陆主机/ip' identified by '密码';

实战案例:创建仅能本机登录的用户 Lotso,密码为 12345678

create user 'Lotso'@'localhost' identified by '12345678';

创建完成后,再次查询 user 表,就能看到新增的用户信息。

✅️避坑提示:如果创建时出现ERROR 1819 (HY000): Your password does not satisfy the current policy requirements报错,是因为 MySQL 开启了密码强度校验。

✅️ 解决方案:通过show variables like 'validate_password%';查看密码策略要求,设置符合复杂度的密码,或临时调整密码策略。

  • 关于新增用户这里,需要大家注意,不要轻易添加一个可以从任意地方登陆的user
  • select host,user, authentication_string from user; – 可以用这个查看下,但是要先选择mysql这个库

2.3.2 删除用户

基础语法

drop user '用户名'@'主机名';

错误示范

-- 直接写用户名会报错,默认匹配%主机,和创建的localhost用户不匹配
drop user Lotso;

正确示范

-- 必须和创建时的用户名+主机名完全匹配
drop user 'Lotso'@'localhost';

2.3.3 修改用户密码

① 用户自己修改自己的密码

set password=password('新的密码');

② root 用户修改指定用户的密码(生产环境常用)

set password for '用户名'@'主机名'=password('新的密码');

实战案例:修改 Lotso 用户的密码为 87654321

set password for 'Lotso'@'localhost'=password('87654321');

2.4 MySQL 权限体系

权限列表我们按使用场景分类整理,方便大家按需分配:

权限分类核心权限适用范围
基础 DML 权限select、insert、update、delete
结构操作权限create、drop、alter、index数据库 / 表
视图专属权限create view、show view视图
存储过程权限create routine、alter routine、execute存储过程 / 函数
管理类权限create user、super、process、reload、shutdown服务器全局
全权限all [privileges]对应范围的所有权限

权限粒度说明

  • *.*:MySQL 实例中所有数据库的所有对象(表、视图、存储过程等)
  • 库名.*:指定数据库中的所有对象
  • 库名.表名:指定数据库中的指定表

2.5 权限的核心操作(授权、回收、查看)

2.5.1 给用户授权

刚创建的用户默认没有任何权限,只能登录 MySQL,无法查看任何业务库,必须手动授权。

基础语法

grant 权限列表 on 库.对象名 to '用户名'@'登陆位置' [identified by '密码'];

语法说明

  • 多个权限用英文逗号分隔,比如select,insert,update
  • identified by是可选的:如果用户已存在,授权的同时会修改密码;如果用户不存在,会直接创建该用户;
  • 授权完成后,若权限未生效,执行flush privileges;刷新权限。

实战案例 1:给 Lotso 用户分配 test 库下所有表的只读权限

grant select on test.* to 'Lotso'@'localhost';

-- 刷新权限,这个别忘了
flush privileges;

授权后,用 whb 账号登录,就能看到 test 库,并且只能执行 select 查询,无法执行 delete、update 等操作,和参考文档效果完全一致。

实战案例 2:给 Lotso 用户分配 test 库的所有权限

grant all privileges on test.* to 'Lotso'@'localhost';

-- 刷新权限
flush privileges;

2.5.2 查看用户权限

show grants for '用户名'@'主机名';

-- 示例:查看Lotso用户的权限
show grants for 'Lotso'@'localhost';

-- 示例:查看root用户的权限
show grants for 'root'@'%';

2.5.3 回收用户权限

基础语法

revoke 权限列表 on 库.对象名 from '用户名'@'登陆位置';

实战案例:回收 Lotso 用户对 test 库的所有权限

revoke all on test.* from 'Lotso'@'localhost';

-- 刷新权限
flush privileges;

回收完成后,Lotso 账号再次登录,就无法看到 test 库了

2.6 生产环境权限最佳实践

  • 最小权限原则:只给用户分配业务必需的权限,绝不分配 all privileges 全局权限;
  • 登录限制:普通业务用户绝不设置%任意地址登录,只允许指定业务服务器 IP 登录;
  • 禁止 root 远程登录:root 用户仅允许localhost本机登录,杜绝远程爆破风险;
  • 按业务分用户:不同的业务系统、不同的微服务创建独立的用户,只分配对应业务库的权限;
  • 定期权限审计:定期清理无用账号,回收过度授权的权限,避免权限泄露。

三. 全文总结

视图核心总结

  • 视图是虚拟表,仅存储查询定义,不存储真实数据,数据全部来自基表;
  • 视图和基表数据双向联动,修改一方会同步影响另一方;
  • 视图不能创建索引、触发器,复杂嵌套视图会影响性能;
  • 核心用途:简化复杂查询、数据权限隔离、统一查询口径。

用户与权限核心总结

  • MySQL 用户唯一标识是 '用户名'@'主机名',二者缺一不可;
  • 用户信息全部存储在mysql.user系统表中,密码加密存储;
  • 授权用grant,回收用revoke,权限变更后需flush privileges刷新;
  • 生产环境严格遵守最小权限原则,禁止滥用 root 账号。

到此这篇关于MySQL入门实战:视图+用户权限管理使用方法(图文+代码)的文章就介绍到这了,更多相关MySQL的视图和用户权限管理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mysqld_exporter+Prometheus+Grafana 配置小结

    mysqld_exporter+Prometheus+Grafana 配置小结

    本文主要介绍了mysqld_exporter+Prometheus+Grafana 配置,实现了对MySQL数据库的监控和可视化展示,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-05-05
  • MySQL表的操作之创建查看删除和修改

    MySQL表的操作之创建查看删除和修改

    这篇文章主要给大家介绍了关于MySQL表的操作之创建查看删除和修改的相关资料,MySQL是最常用的数据库,在数据库操作中基本都是增删改查操作,简称CRUD,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • mysql数据库row_number函数举例介绍

    mysql数据库row_number函数举例介绍

    在MySQL中ROW_NUMBER()是一种用来生成行号的功能函数,通常情况下它用于对查询结果进行编号,以便方便地查看每行的位置,下面这篇文章主要给大家介绍了关于mysql数据库row_number函数举例介绍的相关资料,需要的朋友可以参考下
    2024-02-02
  • mysql之group by和having用法详解

    mysql之group by和having用法详解

    这篇文章主要介绍了mysql之group by和having用法详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 12个优化MySQL的技巧小整理

    12个优化MySQL的技巧小整理

    这篇文章主要介绍了12个优化MySQL的技巧小整理,包括表连接和WHERE语句等基本的优化点等内容,已经了解的也不妨加深一下印象,需要的朋友可以参考下
    2015-06-06
  • 专业级的MySQL开发设计规范及SQL编写规范

    专业级的MySQL开发设计规范及SQL编写规范

    这篇文章主要介绍了专业级的MySQL开发设计规范及SQL编写规范,需要的朋友可以参考下
    2020-11-11
  • SQLyog错误号码MySQL plugin caching_sha2_password could not be loaded的解决方法

    SQLyog错误号码MySQL plugin caching_sha2_password could not 

    这篇文章主要介绍了SQLyog错误号码 plugin caching_sha2_password could not be loaded的解决方法,需要的朋友可以参考下
    2023-06-06
  • Navicat Premium操作MySQL数据库(执行sql语句)

    Navicat Premium操作MySQL数据库(执行sql语句)

    这篇文章主要介绍了Navicat Premium操作MySQL数据库(执行sql语句),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Mysql查看执行计划、explain关键字超详细讲解

    Mysql查看执行计划、explain关键字超详细讲解

    EXPLAIN 是 MySQL 提供的用于分析 SQL 查询执行计划的工具,通过该命令可以获取查询优化器选择的执行路径,下面通过本文给大家介绍Mysql查看执行计划、explain关键字超详细讲解,感兴趣的朋友跟随小编一起看看吧
    2025-06-06
  • 深入Mysql字符集设置分析

    深入Mysql字符集设置分析

    深入Mysql字符集设置分析,使用mysql的朋友可以参考下
    2012-03-03

最新评论