MySQL - 其他
# 1 临时表
创建:CREATE TEMPORATE 临时表名(字段...)
,默认使用innodb存储引擎,即磁盘临时表,也可以指定引擎如 engine = memory 即内存临时表。内存临时表的查询效率高于磁盘临时表。
作用:可使用临时表存储中间结果以拆分复杂查询。
特点:需占用存储空间。临时表是连接隔离的,不同连接的临时表可以同名,互不影响。在连接断开后自动删除。
# 2 视图
如果定义视图的 SQL 语句中包含了聚合函数,就不能对视图中的数据进行 DML 操作
-- 创建视图
CREATE [OR REPLACE] VIEW 视图名称 [(字段列表)] AS 查询语句;
-- 修改视图
ALTER VIEW 视图名 AS 查询语句;
-- 查看视图
DESCRIBE 视图名;
-- 删除视图
DROP VIEW 视图名;
2
3
4
5
6
7
8
# 3 存储过程
存储过程就是把一系列 SQL 语句预先存储在 MySQL 服务器上,需要执行的时候,客户端只需要向服务器端发出调用存储过程的命令,服务器端就可以把预先存储好的这一系列 SQL 语句全部执行。
存储过程可以完成某一特定的业务逻辑;存储过程实际上是一组 SQL 语句;存储过程预先被编译存放在数据库服务器上;
存储过程的优点就是执行效率高,而且更加安全,不过,它也有着自身的缺点,那就是开发和调试的成本比较高,而且不太容易维护。
-- 创建存储过程
CREATE PROCEDURE 存储过程名 ([ IN | OUT | INOUT] 参数名称 类型)程序体;
-- 查看存储过程
SHOW CREATE PROCEDURE 存储过程名称;
-- 调用存储过程
CALL 存储过程名(参数...);
-- 删除存储过程
DROP PROCEDURE 存储过程名称;
2
3
4
5
6
7
8
存储过程的参数定义有 3 种,分别是 IN、OUT 和 INOUT:
- IN 表示输入的参数,存储过程只是读取这个参数的值。如果没有定义参数种类,默认就是 IN,表示输入参数。
- OUT 表示输出的参数,存储过程在执行的过程中,把某个计算结果值赋给这个参数,执行完成之后,调用这个存储过程的客户端或者应用程序就可以读取这个参数返回的值了。
- INOUT 表示这个参数既可以作为输入参数,又可以作为输出参数使用。
除了定义参数种类,还要对参数的数据类型进行定义。如果不指定参数的种类,默认就是 IN,表示输入参数。
# 4 游标
由 SELECT 语句返回的完整行集(包括满足 WHERE 语句中条件的所有行)称为结果集。MySQL 中的 SQL 操作,会对整个结果集起作用。应用程序,特别是交互式的联机应用程序,并不总能将整个结果集作为一个单元来进行有效的处理,这些应用程序需要一种机制,以便每次处理一行或者一部分行。游标就是提供这种机制的,是对结果集的一种扩展。具体而言,MySQL 的游标有以下特点:
- 可以逐条查看数据集中的记录;
- 一次只能查看一条记录;
- 只能向一个方向扫描数据,并且不能跳跃;
- 游标是只读的。
可以使用条件处理语句“DECLARE CONTINUE HANDLER FOR NOT FOUND”,来判断游标到达了结果集的最后。
# 5 触发器
触发器也是存储在服务器端,是一种存储程序,触发器监控的对象是一个特定的表,触发器可以记录日志、进行安全性检查,并且无需应用程序的控制,可以由数据操作的事件驱动,
# 6 权限管理
# 角色
MySQL 8.0引入,相当于权限的集合,方便管理拥有相同权限的用户。
只要你创建了一个角色,系统就会自动给你一个“USAGE”权限,意思是连接登录数据库的权限。
-- 创建角色,
CREATE ROLE 角色名;
-- 创建角色,只能从数据库服务器运行的这台计算机登录这个账号
-- 默认是通配符“%”,意思是这个账号可以从任何一台主机上登录数据库
CREATE ROLE 'manager'@'localhost';
-- 给角色授权
GRANT 权限 ON 表名 TO 角色名;
GRANT SELECT,INSERT,DELETE,UPDATE ON demo.invcount TO 'manager';
-- 查看角色权限
SHOW GRANTS FOR 'manager';
-- 删除角色
DROP ROLE 角色名称;
2
3
4
5
6
7
8
9
10
11
12
MySQL 中创建了角色之后,默认都是没有被激活的,需永久激活:
SET global activate_all_roles_on_login=ON;
# 用户
-- 创建用户
CREATE USER 用户名 [IDENTIFIED BY 密码];
CREATE USER 'zhangsan' IDENTIFIED BY 'mysql';
-- 给用户授权
GRANT 角色名称 TO 用户名称;
GRANT 权限 ON 表名 TO 用户名;
-- 查看用户权限
SHOW GRANTS FOR 用户名;
-- 删除用户
DROP USER 用户名;
2
3
4
5
6
7
8
9
10
尽量使用数据库自己的角色和用户机制来控制访问权限,不要轻易用 Root 账号。因为 Root 账号密码放在代码里面不安全,一旦泄露,数据库就会完全失去保护。