SQL语言备忘录
SQL语言备忘录
- 打开数据库连接
1 | mysql -uroot -p |
- 查看数据库
1 | show databases; |
- 选择数据库
1 | use 数据库名; |
- 查看数据库中的表(选择之后)
1 | show tables; |
- DDL(数据定义语言)
- 创建系列
1
2
3
4
5
6
7create database 数据库名 default character set utf8;
create table 表名(
列名 数据类型,
列名 数据类型,
...
);- 删除系列
1
2drop database 数据库名;
drop table 表名;- 修改系列
1
2
3
4
5alter table 表名 rename 新表名;
alter table 表名 change column 列名 新列名 数据类型;
alter table 表名 modify column 列名 数据类型;
alter database 数据库名 default character set 默认字集;
alter table 表名 drop column 列名;- 约束系列(用的也是修改系列中的alter)
自动增长列
自动增长列就是表中某个列的值会自动增长,一般用于主键列。
自动增长列的语法:
1
2
3
4
5
6 create table 表名(
列名 数据类型 auto_increment,
...
);
alter table 表名 modify 主键列 数据类型 auto_increment;
alter table 表名 modify 自动增长列 数据类型 auto_increment;自动增长列的注意事项:
- 自动增长列只能有一个,且必须是主键列(唯一性也可以)。
- 自动增长列的起始值默认是1,步长默认是1。
- 自动增长列的起始值和步长可以通过alter table语句修改。
主键约束
分为单一主键和复合主键,单一主键就是表中只有一个列作为主键,复合主键就是表中多个列作为主键。
A B 1 2 2 1 1 1 以上这个表得知,加入a,b是联合主键,那就不违反主键约束。
1 | alter table 表名 add primary key(列名); |
外键约束

外键约束就是表中某个列的值必须是另一个表中主键列的值,一般用于表与表之间的关联。
外键约束的语法:1
2alter table 表名 add constraint 外键约束名 foreign key(列名) references 另一个表名(参照的列明);
alter table 表名 drop foreign key 约束名;外键约束的注意事项:
- 外键约束可以有多个,每个外键约束对应一个表中的列。
- 外键约束可以引用另一个表中的主键列,也可以引用另一个表中的唯一约束列。
- 外键约束可以级联操作,即当引用表中的数据被删除或更新时,关联表中的数据也会被删除或更新。
唯一约束
唯一约束就是表中某个列的值必须是唯一的,一般用于列中不允许重复的值。
唯一约束的语法:1
2alter table 表名 add constraint 唯一约束名 unique(列名);
alter table 表名 drop key 约束名;唯一约束的注意事项:
- 唯一约束可以有多个,每个唯一约束对应一个表中的列。
- 唯一约束可以引用另一个表中的主键列,也可以引用另一个表中的唯一约束列。
- 唯一约束可以级联操作,即当引用表中的数据被删除或更新时,关联表中的数据也会被删除或更新。
非空约束
非空约束就是表中某个列的值不能为null,一般用于列中必须有值的情况。
非空约束的语法:1
2alter table 表名 modify 列名 数据类型 not null;
alter table 表名 modify 列名 数据类型 null;非空约束的注意事项:
- 非空约束可以有多个,每个非空约束对应一个表中的列。
- 非空约束不能引用另一个表中的列。
- 非空约束不能级联操作。
当然,约束可以在创建表时添加,也可以在修改表时添加,添加表的时候添加就可以直接在列后面直接写参数
查看约束
1 | show keys from 表名; |
DML(数据操作语言)
添加数据
- 选择插入
选择插入就是指定要插入的列,其他列的值可以为空。
选择插入的语法:1
insert into 表名(列名1,列名2,...) values(值1,值2,...);
选择插入的注意事项:
- 选择插入的列数和值的数量必须一致。
- 选择插入的列可以是主键列,也可以是自动增长列。
- 完全插入
完全插入就是插入所有列的值,列和值的数量必须一致。
完全插入的语法:1
insert into 表名 values(值1,值2,...);
完全插入的注意事项:
- 完全插入的列数和值的数量必须一致。
- 如果主键是自动增长列,那么要用null或者0或者default来占位。
- 选择插入
默认值处理
默认值处理就是在插入数据时,如果没有指定某个列的值,那么就会使用该列的默认值。
默认值处理的语法:1
2alter table 表名 modify 列名 数据类型 default 默认值;
create table 表名(列名 类型 default 默认值);默认值处理的注意事项:
- 默认值处理可以有多个,每个默认值处理对应一个表中的列。
- 默认值处理不能引用另一个表中的列。
- 默认值处理不能级联操作。
更新数据
1
update 表名 set 列名1=值1,列名2=值2,... where 条件;
更新语句中一定要给定更新条件,否则表中的所有数据都会被更新,条件为 列名=值
删除数据
1
2delete from 表名 where 条件;
truncate table 表名; --快速删除表中的所有数据,不记录在日志中,不能回滚删除语句中一定要给定删除条件,否则表中的所有数据都会被删除,条件为 列名=值
DQL(查询语言)
SELECT基本查询

可以查询表中的某一列,某一行的数据,也可以使用链接功能来集合不同表中的数据关键字为select和from
关键字 说明 select 是一个或者多个字段的列表 * 选择所有的列 distinct 从结果中删除重复的行 column expression 选择指定的字段或者表达式 alias 给所选择的列不同的标题 from table 指定包含列的表 1
2
3select * from 表名; --查询表中的所有列的数据,性能低
select 列名1,列名2,... from 表名; --查询表中的指定列的数据
select * from 表名 where 条件; --查询表中满足条件的所有列的数据,也就是查询行,条件为 列名=值,*可以换成列名1,列名2,...别名
1
select 表名.列名 as 别名 from 表名 as 表别名 where 条件; --为列或者表指定别名,表名.可以不加
去重查询
1
select distinct 列名1,列名2,... from 表名; --查询表中指定列的去重数据
多表查询
多表查询产生的结果集都是笛卡尔乘积的子集,为了避免笛卡尔乘积的形成,需要使用where子句来过滤数据,始终包含一个城阙的链接条件。等值连接
多个不同的表中可以有至少n-1个条件作多列的等值链接1
select 列名1,列名2,... from 表名1,表名2,... where 条件1 and 条件2 and ...; --查询表中满足条件的所有列的数据,也就是查询行,条件为 列名=列名 或者 表名.列名=表名.列名
非等值连接
多个不同的表中可以有至少n-1个条件作多列的非等值链接1
select 列名1,列名2,... from 表名1,表名2,... where 条件1 and 条件2 and ...; --查询表中满足条件的所有列的数据,也就是查询行,条件为 列名1 运算符 列名2 或者 表名1.列名1 运算符 表名2.列名2
自连接
自连接就是将一个表与自身连接,通常用于查询表中的自引用数据,比如员工表中的 manager_id 列引用了员工表中的 id 列,就可以使用自连接来查询每个员工的直接上级。这里写一下原因


1
select 列名1,列名2,... from 表名1 as 别名1,表名1 as 别名2 where 别名1.列名=别名2.列名; --查询表中满足条件的所有列的数据,也就是查询行,条件为 别名1.列名=别名2.列名,别名一定要有意义
- 交叉连接
创建两个表的笛卡尔乘积,没有很大的意义1
select 列名1,列名2,... from 表名1 cross join 表名2; --查询表中所有列的数据,也就是查询行,条件为 别名1.列名=别名2.列名
- 自然连接
链接只发生在两个表中有相同名字和数据类型的列上,如果名字相同数据类型不同,natural join会发生错误自然链接也可以写成等值连接,算是等值连接的一种1
select 列名1,列名2,... from 表名1 natural join 表名2;
- 内连接
其实就是查询两个表数据相等的列1
2select 列名1,列名2,... from 表名1 inner join 表名2 on 表名1.列名=表名2.列名;
-- 查询表中满足条件的所有列的数据,也就是查询行,条件为 表名1.列名=表名2.列名,别名一定要有意义,inner可以省略,也无太大意义,就是一个新的写法 - 外连接
除了能查到匹配的数据,还能查到不匹配的数据,用左外连接查询的是左表中的所有数据,右外连接查询的是右表中的所有数据,都查到就是全外连接,外连接也能用where子句来过滤数据union all不会去重,union会去重1
2
3select 列名1,列名2,... from 表名1 left outer join 表名2 on 表名1.列名=表名2.列名; --查询表中满足条件的所有列的数据,也就是查询行,条件为 表名1.列名=表名2.列名,别名一定要有意义,
select 列名1,列名2,... from 表名1 right outer join 表名2 on 表名1.列名=表名2.列名; --查询表中满足条件的所有列的数据,也就是查询行,条件为 表名1.列名=表名2.列名,别名一定要有意义,
(select 列名1,列名2,... from 表名1 where 条件) union (select 列名1,列名2,... from 表名2 where 条件); --查询表中满足条件的所有列的数据,也就是查询行,条件为 表名1.列名=表名2.列名,别名一定要有意义,union可以省略,也无太大意义,就是一个新的写法
- 交叉连接
limit语句分页查询
1
2
3
4
5
6
7
8
9-- 语法一:LIMIT 偏移量, 行数
SELECT * FROM 表名
ORDER BY 某列
LIMIT 偏移量, 行数;
-- 语法二:LIMIT 行数 OFFSET 偏移量
SELECT * FROM 表名
ORDER BY 某列
LIMIT 行数 OFFSET 偏移量;分页查询的原理是根据偏移量和行数来查询数据,偏移量是指从第几条数据开始查询,行数是指查询几条数据,比如偏移量为0,行数为10,就是查询第1条到第10条数据,偏移量为10,行数为10,就是查询第11条到第20条数据,以此类推,这样可以减少过多无用数据所花费的开销
单开一部分的过滤
过滤符 说明 = 等于 !=或<> 不等于 > 大于 >= 大于等于 < 小于 <= 小于等于 between…and… 在某个范围内 like 模式匹配,字符串模糊查询,%表示任意数量的任意字符,_表示一个任意字符如_e%,%e%,第一个就是第二个有e的数据,第二个就是含有e的数据 is null 是null is not null 不是null in(值1,值2,…) 在多个值中 not in 不在多个值中 逻辑条件 说明 and 逻辑与,多个条件同时满足 or 逻辑或,多个条件满足一个即可 not 逻辑非,取反 求值运算优先级 说明 1 算术运算,比如+,-,*,/ 2 连字操作,比如 3 比较运算,比如=,!=,>,>=,<,<= 4 is null, is not null, in, not in, like 5 between…and… 6 not 7 and 8 or DQL执行顺序 from where select order by order by排序
1
select 列名1,列名2,... from 表名 order by 列名1 排序方式,列名2 排序方式,...; --根据指定的列进行排序,默认是升序,asc可以省略,desc是降序
sql函数
- 单行函数
- 操纵数据项
- 接收多个参数并且返回一个值
- 可以嵌套使用
- 作用于每一个返回行
- 每行返回一个结果
- 可以修改数据类型
- 接收多个参数,参数可以是一个列或者一个表达式
格式化 描述 %a 星期几的缩写,如Sun,Mon,Tue,Wed,Thu,Fri,Sat %b 月份的缩写,如Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec %c 月份的数字,如01,02,03,…12 %D 带有英文前缀的月中的天 %d 月的天数,如01,02,03,…31 %e 月的天数,如1,2,3,…31 %H 小时,24小时制,如00,01,02,…23 %h 小时,12小时制,如01,02,03,…12 %i 分钟,如00,01,02,…59 %s 秒,如00,01,02,…59 %w 星期几,如0,1,2,3,4,5,6 %Y 年,如2023 %y 年的后两位,如00,01,02,…99 %p 上午或下午,如AM,PM %r 星期几的数字,如0,1,2,3,4,5,6 函数 属性 参数数据类型 说明 种类 lower(s) 单行函数 字符串 将字符串中的所有字符转换为小写 字符函数 upper(s) 单行函数 字符串 将字符串中的所有字符转换为大写 字符函数 length(s) 单行函数 字符串 返回字符串的长度 字符函数 concat(s1,s2,…) 单行函数 字符串 将多个字符串连接起来 字符函数 lpad(s1,len,s2) 单行函数 字符串,整数,字符串 将字符串s1的左边用字符串s2填充到长度len 字符函数 rpad(s1,len,s2) 单行函数 字符串,整数,字符串 将字符串s1的右边用字符串s2填充到长度len 字符函数 ltrim(s) 单行函数 字符串 删除字符串s左边的空格 字符函数 rtrim(s) 单行函数 字符串 删除字符串s右边的空格 字符函数 trim(s) 单行函数 字符串 删除字符串s左右两边的空格 字符函数 replace(s1,s2,s3) 单行函数 字符串,字符串,字符串 将字符串s1中的所有s2替换为s3 字符函数 reverse(s) 单行函数 字符串 将字符串s反转 字符函数 substr(s,start,len) 单行函数 字符串,整数,整数 返回字符串s从start位置开始的len个字符,从1开始计数 字符函数 substring(s,start,len) 单行函数 字符串,整数,整数 返回字符串s从start位置开始的len个字符,从1开始计数 字符函数 round(column or expression,n) 单行函数 列名 or 数值,整数 将数值column or expression四舍五入到n位小数 数字函数 truncate(column or expression,n) 单行函数 列名 or 数值,整数 将数值column or expression截断到n位小数 数字函数 mod(m,n) 单行函数 整数,整数 返回m除以n的余数 数字函数 curdate() 单行函数 无 返回当前日期 日期函数 curtime() 单行函数 无 返回当前时间 日期函数 date(n) 单行函数 日期 返回日期n 日期函数 datediff(date1,date2) 单行函数 日期,日期 返回日期date1和日期date2之间的天数差 日期函数 day(d) 单行函数 日期 返回日期d的天 日期函数 month(d) 单行函数 日期 返回日期d的月 日期函数 year(d) 单行函数 日期 返回日期d的年 日期函数 hour(t) 单行函数 时间 返回时间t的小时 日期函数 minute(t) 单行函数 时间 返回时间t的分钟 日期函数 second(t) 单行函数 时间 返回时间t的秒 日期函数 now() 单行函数 无 返回当前日期和时间 日期函数 week(d) 单行函数 日期 返回日期d的周数 日期函数 date_format(d,format) 单行函数 日期,字符串 返回日期d按照format格式化后的字符串 转换函数 str_to_date(s,format) 单行函数 字符串,字符串 将字符串s按照format格式化后的日期 转换函数 if(condition,value1,value2) 单行函数 条件,值1,值2 如果条件为true,返回值1,否则返回值2 通用函数 ifnull(column or expression,value) 单行函数 列名 or 表达式,值 如果列名 or 表达式为null,返回值,否则返回列名 or 表达式 通用函数 isnull(column or expression) 单行函数 列名 or 表达式 如果列名 or 表达式为null,返回1,否则返回0 通用函数 nullif(expr1,expr2) 单行函数 列名 or 表达式 比较两个函数是不是相同,相同返回null,反之返回expr1 通用函数 coalesce(expr1,expr2,…) 单行函数 列名 or 表达式 返回参数中的第一个非空表达式 通用函数 - 单行函数
多行函数(聚合函数)
聚合函数介绍必须要对数据分组后才能使用聚合函数,可以理解为单行函数只作用于一行一个数据,而聚合函数作用于多行多个数据的筛选和计算
函数 参数 作用 返回值 count(*) 无 统计行数 整数 count(column) 列名 统计非null值的行数 整数 sum(column) 列名 对数值列求和 数值 avg(column) 列名 对数值列求平均值 数值 max(column) 列名 对数值列求最大值 数值 min(column) 列名 对数值列求最小值 数值 应用如下 1
2-- 统计员工表中员工的数量
select count(*) from employee;补 GROUP BY子句
对你查询的结果集作分组,分组后对每个分组进行聚合函数的计算,在where语句之后1
2
3
4
5-- 查找每个部门的平均工资
select department_id,avg(salary) from employee group by department_id;
-- 多列分组如下
select department_id,job_id,avg(salary) from employee group by department_id,job_id;
-- 查找每个部门每个岗位的平均工资,先对部门id分组,再对岗位id分组在group by子句中必须包含列
having子句
对查询出结果集分组后的结果进行过滤,也就说如果没有group by子句,having子句就没有作用1
2-- 查找每个部门的平均工资,只显示平均工资大于10000的部门
select department_id,avg(salary) from employee group by department_id having avg(salary)>10000;
子查询
加入要写一个查询来找出挣钱比小白多的员工,为了解决这个问题需要两个查询:一个找出小白的收入,第二个找出收入高于小白的员工,可以组合两个查询来解决这个问题,内查询或子查询返回一个值给外查询或主查询,使用一个子查询点给到你关于执行两个连续查询并且用第一个查询的结果作为第二个查询的搜索值
1
2-- 查找收入比小白多的员工
select * from employee where salary>(select salary from emp loyee where last_name='小白');索引介绍
索引是对数据库表中的一列或多列值进行排序的一种结构,利用索引可以快速访问数据库表中的特定信息。索引是一种特殊的文件,他们包含对数据库的查询速度,mysql索引的建立对于mysql的高效运行是很重要的,索引可以大大提高mysql的搜索速度
可能你有疑问,我加不加索引不都是从头到尾找数据吗,但实则如果不加索引,数据库的查找方式类似于顺序查找,而加了索引,数据库会使用B+树的数据结构来查找,一个是log2n,一个是n,所以加索引的效率要高得多,而每次增删改索引的时候树也随之变化,这也就是为什么索引增删改的开销会比较大
1
2
3
4--查询索引
show indexes from table_name;
-- 删除索引
drop index index_name on table_name;优点
- 通过创造唯一性索引,可以保证数据库表中每一行数据的唯一性
- 加快搜索速度
- 加快表与表之间的链接
- 在使用分组和排序来进行检索的时候,可以减少查询中分组和排序的时间
缺点
- 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加
- 索引需要占用物理空间,数据量越大,占用空间越大
- 会降低表增删改的效率,每次增删改索引都需要进行动态维护
应用场景
- 频繁作为查询条件的字段应该创建索引
- 查询中排序的字段创建索引将大大提高排序速度
- 查询中统计或者分组的字段
非应用场景
- 表中数据量很小的表
- 频繁更新的字段
- where条件用不到的字段
- 经常增删改的字段
sql索引类型之普通索引
最基本的索引,没有任何限制
1
2
3
4
5
6
7
8
9
10-- 创建普通索引
create index index_name on table_name(column_name(length));
--如果指定单列索引长度,length必须小于等于列的长度,也可以不加上(length)
alter table table_name add index index_name(column_name);
--用修改表的方式添加索引
--也可以在创建表的时候添加索引,如下
create table table_name(
column_name data_type,
index index_name(column_name(length))
);sql索引类型之唯一索引
索引列的值必须唯一,但允许有空值
1
2
3
4
5
6
7
8
9-- 创建唯一索引
create unique index index_name on table_name(column_name(length));
-- 用修改表的方式添加唯一索引
alter table table_name add unique index index_name(column_name);
--也可以在创建表的时候添加索引,如下
create table table_name(
column_name data_type,
index index_name(column_name(length))
);sql索引类型之主键索引
主键索引是一种特殊的唯一索引,不允许有空值
1
2
3
4
5
6
7
8
9-- 创建主键索引
create primary key index index_name on table_name(column_name(length));
-- 用修改表的方式添加主键索引
alter table table_name add primary key index index_name(column_name);
--也可以在创建表的时候添加索引,如下
create table table_name(
column_name data_type,
index index_name(column_name(length))
);sql索引类型之组合索引
组合索引是指在表的多个字段上创建一个索引,索引中包含了这多个字段的值,通过组合索引可以提高多字段查询的效率
- 最左前缀原则
组合索引的最左前缀原则是指在查询中使用组合索引时,必须按照索引中列的顺序进行查询,否则索引将不会被使用
例如,组合索引index_name(column_name1,column_name2),查询中必须先使用column_name1,然后才能使用column_name2,否则索引将不会被使用
1
2
3
4
5
6
7
8
9
10-- 创建组合索引
create index index_name on table_name(column_name1(length),column_name2(length));
-- 用修改表的方式添加组合索引
alter table table_name add index index_name(column_name1,column_name2);
--也可以在创建表的时候添加索引,如下
create table table_name(
column_name1 data_type,
column_name2 data_type,
index index_name(column_name1(length),column_name2(length))
);- 最左前缀原则
MySQL事务介绍(TCL)
事务是指作为单个逻辑单元执行的一系列操作,要么完全的执行,要么完全的不执行
- 事务定义
- 事务是一个最小的不可再分的工作单元;通常一个事务对应一个完整的业务
- 一个完整的业务需要批量的DML语句来完成
- 事务只和DML语句相关,或者说DML语句才有事务,这个和业务逻辑相关,业务逻辑不同DML语句的个数就不同
- 事务的四个特征(ACID)
- 原子性(Atomicity)
事务是一个不可分割的工作单位,事务中的操作要么全部发生,要么全部不发生
- 一致性(Consistency)
事务必须使数据库从一个一致性状态变换到另一个一致性状态
- 隔离性(Isolation)
事务的隔离性是指一个事务的执行不能被其他事务干扰
- 持久性(Durability)
持久性是指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的
- 原子性(Atomicity)
- 事务类型
- 显式事务
显式事务是指在SQL语句中使用BEGIN、COMMIT、ROLLBACK等语句来控制事务的开始、提交和回滚
- 隐式事务
隐式事务是指在SQL语句中没有使用BEGIN、COMMIT、ROLLBACK等语句来控制事务的开始、提交和回滚,而是依赖于数据库的默认行为
- 显式事务
- TCL语句
语句 说明 start transaction 开始一个事务 commit 提交事务 rollback 回滚事务
1
2
3
4
5
6
7
8
9
10--举一个例子,张三给李四转账100元
start transaction;
update table_name set column_name=column_name-100 where column_name='张三';
update table_name set column_name=column_name+100 where column_name='李四';
--当我们关闭数据库再刷新时,张三和李四的余额并没有变化,这是因为我们没有提交事务,在我们使用start transaction后,数据库会开启一个事务,在事务中进行的操作,只有在我们手动提交事务后,才会对数据库产生影响
commit;
--这时张三和李四的余额都发生了变化,这是因为我们提交了事务
--事务的回滚让数据库回到执行事务操作前的状态
--事务的回滚必须在事务提交之前操作,事务再提交后,就不能回滚了
rollback;回滚数据是必要的,因为事务的隔离性导致如果你写错了代码,直接断开链接,数据库会将你所改变的数据但没提交的数据锁起来不让其他事务访问,这会导致数据的不一致,所以回滚数据是必要的
事务的并发问题
脏读(Dirty Read)
脏读是指一个事务读取了另一个事务未提交的数据,如果事务a读取到了事务b未提交的数据,而事务b回滚了,那么事务a读取到的数据就是脏数据

不可重复读(Non-repeatable Read)
不可重复读是指在一个事务中,对同一行数据进行多次读取,但是每次读取的结果都不同,这是因为在事务中,其他事务对数据进行了修改,导致事务读取到的数据不一致

幻读(Phantom Read)
幻读是指在一个事务中,对同一范围的数据进行多次读取,但是每次读取的结果都不同,这是因为在事务中,其他事务对数据进行了插入或删除,导致事务读取到的数据不一致

事务的隔离级别
- 读未提交(Read Uncommitted)
读未提交是指一个事务可以读取到其他事务未提交的数据,这是最低的隔离级别,会导致脏读、不可重复读和幻读
- 读已提交(Read Committed)
读已提交是指一个事务只能读取到其他事务已提交的数据,这是默认的隔离级别,会导致不可重复读和幻读
- 可重复读(Repeatable Read)
在同一事务内,多次读取同一行数据的结果始终一致(即禁止不可重复读)。MySQL InnoDB 的默认级别
- 串行化(Serializable)
最高的隔离级别,强制事务串行执行,完全避免所有并发问题,但是一个接一个的执行,性能低
1
2
3
4
5
6
7--查看当前数据库的隔离级别
select @@transaction_isolation;
--设置隔离级别
set session transaction isolation level read committed;
set session transaction isolation level repeatable read;
set session transaction isolation level serializable;
set session transaction isolation level read uncommitted;- 读未提交(Read Uncommitted)
- 事务定义
sql用户管理(DCL)
用户管理代码
1
2
3
4
5
6--创建用户
create user 'username'@'host' identified by 'password';
--查看用户
select user,host from mysql.user;
--删除用户
drop user 'username'@'host';权限管理
创建好一个用户之后是不能直接使用的,需要为用户分配权限
1
grant 权限 on 数据库.表 to 'username'@'host' by 'password';
登录主机方式 含义 % 表示所有主机 localhost 表示本地主机 127.0.0.1 表示本地主机 ::1 表示本地主机 权限 作用范围 作用 all 服务器 所有权限 select 表、列 查询数据库中的数据 insert 表 向数据库中插入数据 update 表 更新数据库中的数据 delete 表 删除数据库中的数据 create 数据库 创建 drop 数据库 删除 usage 服务器 没有权限 1
2--刷新权限
flush privileges;
