【MySQL】视图+用户管理

1.视图

  • 视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会影响到视图。
  • 普通视图可以理解为:给一条常用的查询语句起了个 "表名" 的别名,每次访问这个 "别名",数据库就自动执行对应的查询并返回结果 ------ 它不保存结果,只保存 "查结果的方法"
  • 关键前提:不是所有视图都能修改
    只有满足 "可更新视图" 条件的视图,修改才会生效,核心条件是:
    1.视图的查询逻辑只基于单个基表(多表联查的视图通常无法修改);
    2.视图包含基表的主键 / 唯一键(数据库能精准定位要修改的基表行);
    3.视图的字段不是 "计算 / 聚合结果"(比如salary2、COUNT()这类字段无法修改)。
  • 当你对视图执行INSERT/UPDATE/DELETE时,数据库不会直接操作视图(视图无数据),而是根据视图的查询逻辑,反向找到对应的基表行,然后对基表执行修改。

基本操作

  • 创建视图:create view 视图名 as select语句;

    场景:当查询出来的临时结果需要高频反复查询时,每次都要重新使用sql语句,使用视图效率更高

  • 修改了视图,对基表数据有影响

  • 修改了基表,对视图有影响

  • 删除视图

规则和限制

1.与表一样,必须唯一命名(不能出现同名视图或表名)

2.创建视图数目无限制,但要考虑复杂查询创建为视图之后的性能影响(本质是把单次复杂查询的性能代价,放大到每次视图访问------ 原查询的慢、耗资源,会因为视图 "无存储、重复执行" 的特性,从单次问题变成高频问题)

3.视图不能添加索引,也不能有关联的触发器或者默认值

4.视图可以提高安全性,必须具有足够的访问权限

5.order by 可以用在视图中,但是如果从该视图检索数据 select 中也含有 order by ,那么该视图中的 order by 将被覆盖。视图里的ORDER BY:仅在 "直接查询视图且无外层 ORDER BY" 时生效;外层查询加ORDER BY:数据库会忽略视图里的排序逻辑,仅执行外层的排序(即 "覆盖");

为什么视图的ORDER BY会被覆盖?核心原因是:视图作为 "虚拟表",本质是 "子查询",而子查询里的ORDER BY在被外层查询引用时,是无意义的

细节补充:

1.视图加LIMIT/OFFSET时,内层ORDER BY不会被忽略若视图里的ORDER BY搭配了LIMIT(比如取前 10 条),则内层排序会生效,外层排序是 "在这 10 条结果上再排序":

2.标准 SQL 的约束:纯视图不建议加ORDER BYSQL 标准中,ORDER BY是 "结果展示层面的操作",而视图是 "关系表(无序的)"------ 理论上视图不应包含ORDER BY,只有搭配LIMIT(或数据库扩展语法)时,视图里的ORDER BY才被允许。

6.视图可以和表一起使用

2.用户管理

  • MySQL中的用户,都存储在系统数据库mysql的user表中。对用户信息的管理本质上是对表结构记录的增删查改

host: 表示这个用户可以从哪个主机登陆,如果是localhost,表示只能从本机登陆

user: 用户名

authentication_string: 用户密码通过password函数加密后的

*_priv: 用户拥有的权限

创建用户

注意:

--skip-grant-tables是 MySQL 的启动参数,作用是 "绕过权限表的校验"------ 此时 MySQL 不会读取mysql.user等权限表,因此无法执行任何涉及权限管理的语句(CREATE USER、GRANT、ALTER USER等都依赖权限表)。若在配置文件中设置了需要更改才能进行以下操作,返回命令行在/etc/my.cnf中修改

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

    后续用新建账户登录时,只需将-uroot改为-u新账户名即可
  • localhost代表只能从该主机登录,%代表从任意主机登录

修改用户密码

  • 自己改自己:set password=password('新的密码');
  • root用户修改指定用户的密码:
    set password for '用户名'@'主机名'=password('新的密码');

删除用户

  • 语法:drop user '用户名'@'主机名'
    MySQL 的用户身份由 "用户名 + 主机名" 唯一标识,DROP USER必须匹配这个完整标识才能定位到要删除的用户,单独用户名无法删除

数据库的权限

  • 数据库提供的权限列表如下:

    最常见的还是curd操作

给用户授权

刚创建的用户没有任何权限,需要给用户授权。

  • 语法:grant 权限列表 on 库.对象名 to '用户名'@'登陆位置' [identified by '密码']
    1*.* : 代表本系统中的所有数据库的所有对象(表,视图,存储过程等)
    2库.* : 表示某个数据库中的所有数据对象(表,视图,存储过程等)
    3.identified by可选。 如果用户存在,赋予权限的同时修改密码,如果该用户不存在,就是创建用户
  • 权限列表,多个权限用逗号分开:
  • show databases权限
    给ywb用户设置显示任何数据库的权限,注意该权限生效较特殊,需要重新登录用户
    终端1:

    终端2:
    修改权限前,只有默认的元数据库

    授权后重新登录刷新,能和终端1看到同样的内容了
  • 特定用户查看现有权限
    mysql> show grants for '用户名'@'主机名';
  • 查询数据权限:
    终端1:

    终端2:
    未授予新用户对于目标数据库的任意基础访问权限时(SELECT/INSERT/UPDATE)

    授予权限并刷新生效后

  • 赋予所有权限:
    终端1:
    若权限正确设置后没有刷新,重新登录用户即可

    终端2:
    未授予操作权限前

    授予权限并生效后:

回收权限

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

终端1:

注意权限范围,这里回收的是局部test表的权限,但全局的show databases权限还在需要单独回收

终端2:

回收权限后无法访问

相关推荐
一位代码2 小时前
mysql | 数据表中列(字段)的添加、修改和删除
数据库·mysql
水坚石青2 小时前
Java+Swing+Mysql实现物业管理系统
java·开发语言·数据库·mysql·swing
GanGuaGua2 小时前
MySQL:内置函数
数据库·mysql·oracle
一位代码2 小时前
mysql | limit 用法详解及注意事项
数据库·mysql
Li_7695322 小时前
Redis —— (四)
数据库·redis
星哥说事2 小时前
告警通知方式:邮件、短信、Slack、钉钉等告警通知方式的配置
数据库·钉钉
张人玉3 小时前
c#常用的类
服务器·数据库·c#
IT 行者3 小时前
Spring Security 7.0 迁移指南
java·数据库·spring
無量3 小时前
MySQL架构原理与执行流程
后端·mysql