MySQL 从入门到实战:视图特性 + 用户权限管理全解


🔥草莓熊Lotso: 个人主页
❄️个人专栏: 《C++知识分享》 《Linux 入门到实践:零基础也能懂》
✨生活是默默的坚持,毅力是永久的享受!


🎬 博主简介:


文章目录

  • 前言:
  • [一. MySQL 视图(View)全解](#一. MySQL 视图(View)全解)
    • [1.1 视图的核心本质](#1.1 视图的核心本质)
    • [1.2 视图的基础使用](#1.2 视图的基础使用)
      • [1.2.1 创建视图](#1.2.1 创建视图)
      • [1.2.2 查询视图](#1.2.2 查询视图)
      • [1.2.3 视图与基表的双向数据联动](#1.2.3 视图与基表的双向数据联动)
      • [1.2.4 删除视图](#1.2.4 删除视图)
    • [1.3 视图的使用规则与限制](#1.3 视图的使用规则与限制)
  • [二. MySQL 用户管理与权限控制](#二. MySQL 用户管理与权限控制)
    • [2.1 为什么必须做用户管理?](#2.1 为什么必须做用户管理?)
    • [2.2 MySQL 用户的核心存储(查询系统用户以及核心字段解释)](#2.2 MySQL 用户的核心存储(查询系统用户以及核心字段解释))
    • [2.3 用户的核心操作(创建、删除、修改密码)](#2.3 用户的核心操作(创建、删除、修改密码))
      • [2.3.1 创建用户](#2.3.1 创建用户)
      • [2.3.2 删除用户](#2.3.2 删除用户)
      • [2.3.3 修改用户密码](#2.3.3 修改用户密码)
    • [2.4 MySQL 权限体系](#2.4 MySQL 权限体系)
    • [2.5 权限的核心操作(授权、回收、查看)](#2.5 权限的核心操作(授权、回收、查看))
      • [2.5.1 给用户授权](#2.5.1 给用户授权)
      • [2.5.2 查看用户权限](#2.5.2 查看用户权限)
      • [2.5.3 回收用户权限](#2.5.3 回收用户权限)
    • [2.6 生产环境权限最佳实践](#2.6 生产环境权限最佳实践)
  • [三. 全文总结](#三. 全文总结)
  • 结尾:

前言:

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


一. MySQL 视图(View)全解

1.1 视图的核心本质

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

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

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

它的核心价值在于:

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

1.2 视图的基础使用

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

1.2.1 创建视图

基础语法

sql 复制代码
create view 视图名 as select查询语句;

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

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

1.2.2 查询视图

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

sql 复制代码
-- 基础查询
select * from v_ename_dname;

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

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

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

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

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

② 修改基表,影响视图

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

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

1.2.4 删除视图

sql 复制代码
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表中,这是用户管理的核心。

查询系统用户

sql 复制代码
-- 切换到mysql系统库
use mysql;

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

核心字段解释

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

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

2.3.1 创建用户

基础语法

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

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

sql 复制代码
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 删除用户

基础语法

sql 复制代码
drop user '用户名'@'主机名';

错误示范

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

正确示范

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

2.3.3 修改用户密码

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

sql 复制代码
set password=password('新的密码');

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

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

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

sql 复制代码
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,无法查看任何业务库,必须手动授权。

基础语法

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

语法说明

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

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

sql 复制代码
grant select on test.* to 'Lotso'@'localhost';

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

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

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

sql 复制代码
grant all privileges on test.* to 'Lotso'@'localhost';

-- 刷新权限
flush privileges;

2.5.2 查看用户权限

sql 复制代码
show grants for '用户名'@'主机名';

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

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

2.5.3 回收用户权限

基础语法

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

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

sql 复制代码
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 账号。

结尾:

html 复制代码
🍓 我是草莓熊 Lotso!若这篇技术干货帮你打通了学习中的卡点:
👀 【关注】跟我一起深耕技术领域,从基础到进阶,见证每一次成长
❤️ 【点赞】让优质内容被更多人看见,让知识传递更有力量
⭐ 【收藏】把核心知识点、实战技巧存好,需要时直接查、随时用
💬 【评论】分享你的经验或疑问(比如曾踩过的技术坑?),一起交流避坑
🗳️ 【投票】用你的选择助力社区内容方向,告诉大家哪个技术点最该重点拆解
技术之路难免有困惑,但同行的人会让前进更有方向~愿我们都能在自己专注的领域里,一步步靠近心中的技术目标!

结语:如果本文对你有帮助,欢迎点赞、收藏、关注,后续会持续分享 MySQL 索引、事务、锁、存储引擎等核心实战内容。有任何问题都可以在评论区留言,我会一一解答!

✨把这些内容吃透超牛的!放松下吧✨ ʕ˘ᴥ˘ʔ づきらど


相关推荐
雾岛听蓝2 小时前
进程信号机制深度解析
linux·开发语言·经验分享·笔记
Q741_1472 小时前
每日一题 力扣 1848. 到目标元素的最小距离 模拟 C++题解
c++·算法·leetcode·模拟
zmjjdank1ng3 小时前
OSI模型和TCP/IP模型
服务器·网络·tcp/ip
Navicat中国3 小时前
如何使用 Ollama 配置 AI 助手 | Navicat 教程
数据库·人工智能·ai·navicat·ollama
小猿姐8 小时前
实测对比:哪款开源 Kubernetes MySQL Operator 最值得用?(2026 深度评测)
数据库·mysql·云原生
qwy7152292581639 小时前
1-Docker Engine 安装前置环境配置
运维·docker·容器
倔强的石头_10 小时前
从 “存得下” 到 “算得快”:工业物联网需要新一代时序数据平台
数据库
W230357657310 小时前
经典算法:最长上升子序列(LIS)深度解析 C++ 实现
开发语言·c++·算法
.Ashy.10 小时前
2026.4.11 蓝桥杯软件类C/C++ G组山东省赛 小记
c语言·c++·蓝桥杯