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:
回收权限后无法访问
