Mysql命令总结(二)

  1. 1. mysql接上篇
    1. 1.1. 十一、备份与还原
    2. 1.2. 十二、视图
    3. 1.3. 十三、事务
    4. 1.4. 十四、锁表
    5. 1.5. 十五、触发器(尽量少用)
    6. 1.6. 十六、SQL编程
    7. 1.7. 十七、存储过程
    8. 1.8. 十八、用户与权限管理
    9. 1.9. 十九、表维护
    10. 1.10. 二十、杂项

版权声明:本文转载自一千行 MySQL 学习笔记,并在一定程度上进行了增删改

mysql接上篇

注:所有操作基于day01数据库

注:所有sql命令中的 [字段] 意为可选字段

十一、备份与还原

注意:以下所有命令不能在mysql的命令环境中执行,在纯命令行中执行。以下路径为windows路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
利用 mysqldump 指令完成。
-- 导出
mysqldump [options] db_name [tables]
mysqldump [options] ---database DB1 [DB2 DB3...]
mysqldump [options] --all--database
1. 导出一张表
mysqldump -u用户名 -p密码 库名 表名 > 文件名(D:\a.sql)
2. 导出多张表
mysqldump -u用户名 -p密码 库名 表123 > 文件名(D:\a.sql)
-- 例:mysqldump -u用户名 -p密码 day01 user t_user > D:\user_table.sql
-- 解释:导出day01下的user表与t_user表
3. 导出所有表
mysqldump -u用户名 -p密码 库名 > 文件名(D:\a.sql)
4. 导出一个库
mysqldump -u用户名 -p密码 --lock-all-tables --database 库名 > 文件名(D:\a.sql)
-- (--lock-all-tables) 在mysqldump导出的整个过程中以read方式锁住所有表
可以-w携带WHERE条件
-- 导入
1. 在登录mysql的情况下:
source 备份文件
2. 在不登录的情况下
mysql -u用户名 -p密码 库名 < 备份文件
-- 例:mysql -u用户名 -p密码 day02 < D:\user_table.sql
-- 解释:将D盘路径下的该sql文件导入到day02数据库中(day02数据库必须已经存在)

十二、视图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
什么是视图:视图是一个虚拟表
视图的作用类似于筛选出一个虚拟表,定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。
它主要出于两种原因:
1. 安全原因,视图可以隐藏一些数据与表结构,对客户端隐藏真实的表结构
2. 另一原因是可使复杂的查询易于理解和使用。简化业务逻辑

-- 创建视图
CREATE [OR REPLACE] [ALGORITHM={UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS select_statement
-- or replace:如果存在同名的表则替换(也可用于完全更新)
-- ALGORITHM=:(指定视图执行的算法,一般不用)
-- UNDEFINED:未定义,自动,让系统帮你选
-- MERGE:当使用视图时,会把查询视图的语句和创建视图的语句合并起来,形成一条语
-- TEMPTABLE:当使用视图时,会把创建视图的语句的查询结果当成一张临时表,再从临时表中进行筛选
-- (column_list):用于给视图的列取别名,数目必须等于SELECT语句检索的列数(一般不用,直接在select表后as取别名即可)
-- 例:CREATE VIEW view_user (v_id, v_name, v_age) as (SELECT id, name, age FROM user);
-- 解释:将从user查询到的结果创建一张虚拟表view_user,并将对应的结果取别名v_id,v_name,v_age;
-- 推荐下面这种,便于理解,结果同上
-- 例:CREATE VIEW view_user as (SELECT id as v_id, name as v_name, age as v_age FROM user);

-- 查看结构
SHOW CREATE VIEW view_name

-- 查看表的状态(可以用来查看表还是视图)
SHOW table status;
-- show tables -- 查看所有表

-- 删除视图(省略号:多个)
DROP VIEW [IF EXISTS] view_name, ...

-- 修改视图结构
- 一般不修改视图,因为不是所有的更新视图都会映射到表上。
ALTER VIEW view_name [(column_list)] AS select_statement
- 视图的其他结构的修改同表的修改
-- 改名:RENAME TABLE view_money to vw_money;

-- 视图的增删改
注:如果对视图的一次增删改只会影响原本一个表的数据,那么会执行成功并更新原本的表
如果一次影响两张或以上的表的数据,则会报错。

-- 视图算法(ALGORITHM)
MERGE 合并
将视图的查询语句,与外部查询需要先合并再执行!
TEMPTABLE 临时表
将视图执行完毕后,形成临时表,再做外层查询!
UNDEFINED 未定义(默认),指的是MySQL自主去选择相应的算法。

十三、事务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
事务是指逻辑上的一组操作,组成这组操作的各个单元,要不全成功要不全失败。
- 支持连续SQL的集体成功或集体撤销。
- 事务是数据库在数据完整性方面的一个功能。
- 需要利用 InnoDB 或 BDB 存储引擎,对自动提交的特性支持完成。
- InnoDB被称为事务安全型引擎。
-- 事务开启
START TRANSACTION; 或者 BEGIN;
开启事务后,所有被执行的SQL语句均被认作当前事务内的SQL语句。
-- 事务提交
COMMIT;
-- 事务回滚
ROLLBACK;
如果部分操作发生问题,映射到事务开启前。
-- 事务的特性
1. 原子性(Atomicity)
事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2. 一致性(Consistency)
事务前后数据的完整性必须保持一致。
- 事务开始和结束时,外部数据一致
- 在整个事务过程中,操作是连续的
3. 隔离性(Isolation)
多个用户并发访问数据库时,一个用户的事务不能被其它用户的事物所干扰,多个并发事务之间的数据要相互隔离。
4. 持久性(Durability)
一个事务一旦被提交,它对数据库中的数据改变就是永久性的。
-- 事务的实现
1. 要求是事务支持的表类型(innodb)
2. 执行一组相关的操作前开启事务
3. 整组操作完成后,都成功,则提交;如果存在失败,选择回滚,则会回到事务开始的备份点。
-- 事务的原理
利用InnoDB的自动提交(autocommit)特性完成。
普通的MySQL执行语句后,当前的数据提交操作均可被其他客户端可见。
而事务是暂时关闭“自动提交”机制,需要commit提交持久化数据操作。
-- 注意
1. 数据定义语言(DDL)语句不能被回滚,比如创建或取消数据库的语句,和创建、取消或更改表或存储的子程序的语句。
2. 事务不能被嵌套
-- 保存点
SAVEPOINT 保存点名称 -- 设置一个事务保存点
ROLLBACK TO SAVEPOINT 保存点名称 -- 回滚到保存点
RELEASE SAVEPOINT 保存点名称 -- 删除保存点
-- InnoDB自动提交特性设置
SET autocommit = 0|1; 0表示关闭自动提交,1表示开启自动提交。
- 如果关闭了,那普通操作的结果对其他客户端也不可见,需要commit提交后才能持久化数据操作。
- 也可以关闭自动提交来开启事务。但与START TRANSACTION不同的是,
SET autocommit是永久改变服务器的设置,直到下次再次修改该设置。(针对当前连接)
START TRANSACTION记录开启前的状态,而一旦事务提交或回滚后就需要再次开启事务。(针对当前事务)

十四、锁表

参考视频:行锁、表锁、间隙锁

1
2
3
4
5
6
7
8
MyISAM 支持表锁,InnoDB 支持行锁与表锁
- 当InnoDB中的索引失效时,就会由行锁变表锁
-- innodb当更新某条数据时会启用行锁。锁住这行数据。如果索引失效,会升级为表锁

-- 如何直观查看
1. 关闭mysql的自动提交:set autocommit=0
2. 行锁:模拟更新一条数据,不提交(commit)(也可以看到防止脏读),然后sql再更新该行,会看到阻塞。
3. 表锁,同上,再模拟出索引失效,再sql更新其他行,会看到阻塞。

十五、触发器(尽量少用)

少用原因:1.sql语句部分程度上不可追踪。2.团队开发容易忽视。3.存在性能问题

参考视频:MySQL触发器设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/* 触发器 */ ------------------
触发程序是与表有关的命名数据库对象,当该表出现特定事件时,将激活该对象
监听:记录的增加、修改、删除。
-- 创建触发器
CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt
参数:
trigger_name触发器名称
trigger_time是触发程序的动作时间。它可以是 before 或 after,以指明触发程序是在激活它的语句之前或之后触发。
trigger_event指明了激活触发程序的语句的类型
INSERT:将新行插入表时激活触发程序
UPDATE:更改某一行时激活触发程序
DELETE:从表中删除某一行时激活触发程序
tbl_name:监听的表,必须是永久性的表,不能将触发程序与TEMPORARY表或视图关联起来。
trigger_stmt:当触发程序激活时执行的语句。执行多个语句,可使用BEGIN...END复合语句结构
-- 例: delimiter //
CREATE TRIGGER trigger1 after INSERT ON user FOR EACH ROW
BEGIN
sql语句;
sql语句;
END //
delimiter; -- 此处可能也不需要
-- 解释:创建名为trigger1的触发器:在user表的insert操作执行之后,执行两条sql语句
-- 注意:delimiter // 是修改结束符,后面的//也要保留

-- 删除
DROP TRIGGER [schema_name.]trigger_name
可以使用oldnew代替旧的和新的数据
更新操作,更新前是old,更新后是new.
删除操作,只有old.
增加操作,只有new.
-- 注意
1. 对于具有相同触发程序动作时间和事件的给定表,不能有两个触发程序。
-- 字符连接函数
concat(str1,str2,...])
concat_ws(separator,str1,str2,...)
-- 分支语句
if 条件 then
执行语句
elseif 条件 then
执行语句
else
执行语句
end if;
-- 修改最外层语句结束符
delimiter 自定义结束符号
SQL语句
自定义结束符号
delimiter ; -- 修改回原来的分号
-- 语句块包裹
begin
语句块
end
-- 特殊的执行
1. 只要添加记录,就会触发程序。
2. Insert into on duplicate key update 语法会触发:
如果没有重复记录,会触发 before insert, after insert;
如果有重复记录并更新,会触发 before insert, before update, after update;
如果有重复记录但是没有发生更新,则触发 before insert, before update
3. Replace 语法 如果有记录,则执行 before insert, before delete, after delete, after insert

十六、SQL编程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/* SQL编程 */ ------------------
--// 局部变量 ----------
-- 变量声明
declare var_name[,...] type [default value]
这个语句被用来声明局部变量。要给变量提供一个默认值,请包含一个default子句。值可以被指定为一个表达式,不需要为一个常数。如果没有default子句,初始值为null
-- 赋值
使用 setselect into 语句为变量赋值。
- 注意:在函数内是可以使用全局变量(用户自定义的变量)
--// 全局变量 ----------
-- 定义、赋值
set 语句可以定义并为变量赋值。
set @var = value;
也可以使用select into语句为变量初始化并赋值。这样要求select语句只能返回一行,但是可以是多个字段,就意味着同时为多个变量进行赋值,变量的数量需要与查询的列数一致。
还可以把赋值语句看作一个表达式,通过select执行完成。此时为了避免=被当作关系运算符看待,使用:=代替。(set语句可以使用= 和 :=)。
select @var:=20;
select @v1:=id, @v2=name from t1 limit 1;
select * from tbl_name where @var:=30;
select into 可以将表中查询获得的数据赋给变量。
-| select max(height) into @max_height from tb;
-- 自定义变量名
为了避免select语句中,用户自定义的变量与系统标识符(通常是字段名)冲突,用户自定义变量在变量名前使用@作为开始符号。
@var=10;
- 变量被定义后,在整个会话周期都有效(登录到退出)
--// 控制结构 ----------
-- if语句
if search_condition then
statement_list
[elseif search_condition then
statement_list]
...
[else
statement_list]
end if;
-- case语句
CASE value WHEN [compare-value] THEN result
[WHEN [compare-value] THEN result ...]
[ELSE result]
END
-- while循环
[begin_label:] while search_condition do
statement_list
end while [end_label];
- 如果需要在循环内提前终止 while循环,则需要使用标签;标签需要成对出现。
-- 退出循环
退出整个循环 leave
退出当前循环 iterate
通过退出的标签决定退出哪个循环
--// 内置函数 ----------
-- 数值函数
abs(x) -- 绝对值 abs(-10.9) = 10
format(x, d) -- 格式化千分位数值 format(1234567.456, 2) = 1,234,567.46
ceil(x) -- 向上取整 ceil(10.1) = 11
floor(x) -- 向下取整 floor (10.1) = 10
round(x) -- 四舍五入去整
mod(m, n) -- m%n m mod n 求余 10%3=1
pi() -- 获得圆周率
pow(m, n) -- m^n
sqrt(x) -- 算术平方根
rand() -- 随机数
truncate(x, d) -- 截取d位小数
-- 时间日期函数
now(), current_timestamp(); -- 当前日期时间
current_date(); -- 当前日期
current_time(); -- 当前时间
date('yyyy-mm-dd hh:ii:ss'); -- 获取日期部分
time('yyyy-mm-dd hh:ii:ss'); -- 获取时间部分
date_format('yyyy-mm-dd hh:ii:ss', '%d %y %a %d %m %b %j'); -- 格式化时间
unix_timestamp(); -- 获得unix时间戳
from_unixtime(); -- 从时间戳获得时间
-- 字符串函数
length(string) -- string长度,字节
char_length(string) -- string的字符个数
substring(str, position [,length]) -- 从str的position开始,取length个字符
replace(str ,search_str ,replace_str) -- 在str中用replace_str替换search_str
instr(string ,substring) -- 返回substring首次在string中出现的位置
concat(string [,...]) -- 连接字串
charset(str) -- 返回字串字符集
lcase(string) -- 转换成小写
left(string, length) -- 从string2中的左边起取length个字符
load_file(file_name) -- 从文件读取内容
locate(substring, string [,start_position]) -- 同instr,但可指定开始位置
lpad(string, length, pad) -- 重复用pad加在string开头,直到字串长度为length
ltrim(string) -- 去除前端空格
repeat(string, count) -- 重复count次
rpad(string, length, pad) --在str后用pad补充,直到长度为length
rtrim(string) -- 去除后端空格
strcmp(string1 ,string2) -- 逐字符比较两字串大小
-- 流程函数
case when [condition] then result [when [condition] then result ...] [else result] end 多分支
if(expr1,expr2,expr3) 双分支。
-- 聚合函数
count()
sum();
max();
min();
avg();
group_concat()
-- 其他常用函数
md5();
default();
--// 存储函数,自定义函数 ----------
-- 新建
CREATE FUNCTION function_name (参数列表) RETURNS 返回值类型
函数体
- 函数名,应该合法的标识符,并且不应该与已有的关键字冲突。
- 一个函数应该属于某个数据库,可以使用db_name.funciton_name的形式执行当前函数所属数据库,否则为当前数据库。
- 参数部分,由"参数名"和"参数类型"组成。多个参数用逗号隔开。
- 函数体由多条可用的mysql语句,流程控制,变量声明等语句构成。
- 多条语句应该使用 begin...end 语句块包含。
- 一定要有 return 返回值语句。
-- 删除
DROP FUNCTION [IF EXISTS] function_name;
-- 查看
SHOW FUNCTION STATUS LIKE 'partten'
SHOW CREATE FUNCTION function_name;
-- 修改
ALTER FUNCTION function_name 函数选项
--// 存储过程,自定义功能 ----------
-- 定义
存储存储过程 是一段代码(过程),存储在数据库中的sql组成。
一个存储过程通常用于完成一段业务逻辑,例如报名,交班费,订单入库等。
而一个函数通常专注与某个功能,视为其他程序服务的,需要在其他语句中调用函数才可以,而存储过程不能被其他调用,是自己执行 通过call执行。
-- 创建
CREATE PROCEDURE sp_name (参数列表)
过程体
参数列表:不同于函数的参数列表,需要指明参数类型
IN,表示输入型
OUT,表示输出型
INOUT,表示混合型
注意,没有返回值。

十七、存储过程

参考视频:MySQL数据库存储过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/* 存储过程 */ ------------------
存储过程是一段可执行性代码的集合。相比函数,更偏向于业务逻辑。
调用:CALL 过程名
-- 注意
- 没有返回值。
- 只能单独调用,不可夹杂在其他语句中
-- 参数
IN|OUT|INOUT 参数名 数据类型
IN 输入:在调用过程中,将数据输入到过程体内部的参数
OUT 输出:在调用过程中,将过程体处理完的结果返回到客户端
INOUT 输入输出:既可输入,也可输出
-- 语法
CREATE PROCEDURE 过程名 (参数列表)
BEGIN
过程体
END

-- 例:简单案例
-- 创建名为my_procedure01()的存储过程
delimiter //
create procedure my_procedure01()
begin
declare nickname varchar(32) default 'SF'; -- 定义名为nickname的变量默认只为'SF'
select nickname; -- 查询nickname的值
set nickname = 'UG'; -- 改变nickname的值为'UG'
select nickname; -- 查询nickname的值
end // -- 创建存储过程执行完毕

call my_procedure01(); -- 调用存储过程

drop procedure my_procedure01; -- 删除存储过程

十八、用户与权限管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
-- root密码重置(第6步重要)
1. 停止MySQL服务(以管理员权限运行)
-- net stop mysql
2. 跳过mysql的表授权,(不输入密码也可以获取管理员权限)
[Linux] /usr/local/mysql/bin/safe_mysqld --skip-grant-tables & (命令前是自己的安装地址)
[Windows] mysqld --skip-grant-tables
3. 另启一个命令行窗口,选中mysql的的mysql数据库
-- use mysql
4.更新mysql数据库中的user表,该表存储了用户名与密码
-- update user set password=('root') where user='root';
-- 解释:更新user表中名为root的用户的密码为root
5.刷新权限
-- FLUSH PRIVILEGES;
6. 退出并杀死重启mysql(否则依旧可以无密码使用)
-- exit;
-- 杀死mysql重启(关闭mysqld服务,否则mysql服务无法启动,如果登录mysql报1103错误,参考https://www.cnblogs.com/rnckty/p/5577818.html)

-- 增加用户
- 先进入mysql环境,选择mysql数据库:use mysql;
CREATE USER 'user_name'@'host' IDENTIFIED BY [PASSWORD] 密码(字符串)
- 必须拥有mysql数据库的全局CREATE USER权限,或拥有INSERT权限。
- 只能创建用户,不能赋予权限。
- 用户名,注意引号:如 'user_name'@'192.168.1.1'
- user_name:用户名。host:用户登录ip地址,如只允许从本机登陆,则填'localhost' ,允许远程登,则填'%'
- 密码也需引号,纯数字密码也要加引号
- 要在纯文本中指定密码,需忽略PASSWORD关键词。要把密码指定为由PASSWORD()函数返回的混编值,需包含关键字PASSWORD
-- 例:create user 'user1'@'localhost' identified by 'user1';
-- 解释:创建user1用户,密码是user1

-- 重命名用户
RENAME USER 'old_user_name'@'host' TO 'new_user_name'@'host'
-- 例:RENAME USER 'user1'@'localhost' TO 'ren_user1'@'localhost';
-- 解释:将user1用户重命名为ren_user1;

-- 设置密码
SET PASSWORD = PASSWORD('密码') -- 为当前用户设置密码
SET PASSWORD FOR 'user_name'@'host' = PASSWORD('密码') -- 为指定用户设置密码
-- 例:set password for 'ren_user1'@'localhost'=password('ren_user1');
-- 解释:将ren_user1用户的密码改为ren_user1

-- 权限层级
-- 要使用GRANT或REVOKE,您必须拥有GRANT OPTION权限,并且您必须用于您正在授予或撤销的权限。
- 全局层级:全局权限适用于一个给定服务器中的所有数据库,mysql.user
GRANT ALL ON *.* TO 'user_name'@'host'REVOKE ALL ON *.* FROM 'user_name'@'host' 只授予和撤销全局权限。
-- 例:GRANT ALL ON *.* TO 'ren_user1'@'localhost'
-- 解释:给与ren_user1用户全局权限,ALL指代所有权限,*.*指代全局
-- 例:REVOKE ALL ON *.* FROM 'ren_user1'@'localhost'
-- 解释:移除ren_user1用户全局权限
- 数据库层级:数据库权限适用于一个给定数据库中的所有目标,mysql.db, mysql.host
GRANT ALL ON db_name.* TOREVOKE ALL ON db_name.* FROM 只授予和撤销数据库权限。
- 表层级:表权限适用于一个给定表中的所有列,mysql.talbes_priv
GRANT ALL ON db_name.tbl_name TOREVOKE ALL ON db_name.tbl_name FROM只授予和撤销表权限。
- 列层级:列权限适用于一个给定表中的单一列,mysql.columns_priv
当使用REVOKE时,您必须指定与被授权列相同的列。
GRANT ALL (col1,col2) ON db_name.tbl_name TO
-- 权限列表,如下可以替换上面的ALL
ALL [PRIVILEGES] -- 设置除GRANT OPTION之外的所有简单权限
ALTER -- 允许使用ALTER TABLE
ALTER ROUTINE -- 更改或取消已存储的子程序
CREATE -- 允许使用CREATE TABLE
CREATE ROUTINE -- 创建已存储的子程序
CREATE TEMPORARY TABLES -- 允许使用CREATE TEMPORARY TABLE
CREATE USER -- 允许使用CREATE USER, DROP USER, RENAME USER和REVOKE ALL PRIVILEGES。
CREATE VIEW -- 允许使用CREATE VIEW
DELETE -- 允许使用DELETE
DROP -- 允许使用DROP TABLE
EXECUTE -- 允许用户运行已存储的子程序
FILE -- 允许使用SELECT...INTO OUTFILE和LOAD DATA INFILE
INDEX -- 允许使用CREATE INDEX和DROP INDEX
INSERT -- 允许使用INSERT
LOCK TABLES -- 允许对您拥有SELECT权限的表使用LOCK TABLES
PROCESS -- 允许使用SHOW FULL PROCESSLIST
REFERENCES -- 未被实施
RELOAD -- 允许使用FLUSH
REPLICATION CLIENT -- 允许用户询问从属服务器或主服务器的地址
REPLICATION SLAVE -- 用于复制型从属服务器(从主服务器中读取二进制日志事件)
SELECT -- 允许使用SELECT
SHOW DATABASES -- 显示所有数据库
SHOW VIEW -- 允许使用SHOW CREATE VIEW
SHUTDOWN -- 允许使用mysqladmin shutdown
SUPER -- 允许使用CHANGE MASTER, KILL, PURGE MASTER LOGS和SET GLOBAL语句,mysqladmin debug命令;允许您连接(一次),即使已达到max_connections。
UPDATE -- 允许使用UPDATE
USAGE -- “无权限”的同义词
-- 同时授予用户授予权限的权限
GRANT OPTION -- 允许授予权限
-- 这里使用跟在末尾
-- 例子:GRANT ALL ON *.* TO 'ren_user1'@'localhost' with GRANT OPTION

-- 删除用户
DROP USER 'user_name'@'host'

十九、表维护

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/* 表维护 */
-- 分析和存储表的关键字分布
ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE 表名 ...
- ANALYZE TABLE语句被写入二进制日志中,除非使用了自选的NO_WRITE_TO_BINLOG关键词(或其别名LOCAL)。
-- 例:analyze table day01.user;
-- 解释:分析day01中的user表
-- 结果参数解释
-- Table:表名称 Op:进行状态 Msg_type:状态、错误、信息或警告之一 Msg_text:消息
-- 检查一个或多个表是否有错误
CHECK TABLE tbl_name [, tbl_name] ... [option] ...
option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED}
-- 例:check TABLE day01.user [quick];
-- 整理数据文件的碎片
OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...
-- 例:optimize table day01.user;

二十、杂项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* 杂项 */ ------------------
1. 可用反引号(`)为标识符(库名、表名、字段名、索引、别名)包裹,以避免与关键字重名!中文也可以作为标识符!
2. 每个库目录存在一个保存当前数据库的选项文件db.opt。
3. 注释:
单行注释 # 注释内容
多行注释 /* 注释内容 */
单行注释 -- 注释内容 (标准SQL注释风格,要求双破折号后加一空格符(空格、TAB、换行等))
4. 模式通配符:
_ 任意单个字符
% 任意多个字符,甚至包括零字符
单引号需要进行转义 \'
5. CMD命令行内的语句结束符可以为 ";", "\G", "\g",仅影响显示结果。其他地方还是用分号结束。delimiter 可修改当前对话的语句结束符。
6. SQL对大小写不敏感
7. 清除已有语句:\c