MySQL知识总结
一、什么是数据库
●用来存储和管理数据的仓库
本质就是一个文件系统,还是以文件的形式,将数据保存在电脑硬盘上。
●为什么要使用数据库?
-
-
存储方式 优点 que’dian 内存(变量 数组 集合) 速度快 不能持久化存储,数据实临时的 文件 数据持久化 使用IO流来操作文件,不方便 数据库 1.数据可以永久保存;2方便管理和存储数据库;3:使用统一的操作方式操作数据库(SQL语句) 占用资源,收费的
-
-
开发中常用的数据库:
Mysql :开源免费的数据库
Oracle:收费的,安全性高
DB2:IBM,收费的超大型的数据库,在银行系统中
SQL server: # .net 只能运行在windows
二、MySQL卸载和安装
●进入MySQL官网:https://www.mysql.com/downloads/
三、MySQL和Java的关系
●问题1:数据库系统是一个独立的程序;设计的Java(web)应用程序也是一个独立的程序。两者之间如何联系?如何让Java访问数据库?
处理方式:给两者之间搭建一个“桥”,也就是数据库连接,通过此桥,实现两者的沟通与信息交互。
●问题2:谁来搭建这个桥?
处理方式:找一个建筑队来完成。
在计算机上,建筑队就是一个类(DriverManager),要完成工作,必须由类的方法。即有类DriverManager中的方法getConnection(建连接所需要的资源),就可以创建一个数据库连接。
实现:Connection conn=DriverManager.getConnection(url);
url:建立连接所需要的资源。
●问题3:建桥需要哪些资源?
处理方式:需要至少三个资源,访问数据库所需要的:用户名、密码、数据库名。
(在计算机里,我们称为数据库连接字URL-------统一资源定位)。
●问题4:如何找到建筑队?
处理方式:必须有一个管理建筑队的机构,在计算机上,称为驱动程序(java.sql.Driver)
实现:获取“建筑队”------即:加载驱动程序。Class.forName(com.mysql.jdbc.Driver);
其中,com.mysql.jdbc.Driver为MySQL连接的驱动程序
四、使用数据库
●开启服务----》找到mysql服务
○win+r ----->services.msc ------------->mysql
○一定要是管理员的权限
● 登录mysql
○win+r输入cmd:
mysql -u用户名 -p密码
mysql -h主机ip -u用户名 -p密码 -h 指定主机
●退出
exit
quit
五、SQL语句
1.操作表
●创建表
create table 表名
●创建和以前一样的表结构
create table 新表名 like 旧的表名
●查看表
show tables; -- 查看所有的表
desc 表名; 表的信息
●删除表
drop table 表名;
drop table if exists; 判断是否存在
2. 修改表
●修改表名
rename table 旧表 to 新表;
●修改字符集
alter table 表名 character set 字符集;
●向表中添加列(字段)
alter table 表名 add 字段名称 字段的类型
●修改表中字段的类型或长度
alter table 表名 modify 字段名称 字段类型
●修改字段的名
alter table 表名 change 旧列名 新列名 类型(长度)
●删除列
alter table 表名 drop 列名
3.操作表数据
●插入全部数据,写字段名
insert into 表名(字段1,字段2,。。。) values(数据1,数据2,数据.....);
●插入全部数据,不写字段名
insert into 表名 values(数据1,数据2,数据.....);
●插入指定字段值
insert into 表名(字段名) values(数据);
●注意事项
* 值和字段必须要对应(个数/类型相同)
* 值的数据大小,必须在字段指定的长度范围内
* varchar char data 值必须使用单引号,或者双引号
* 如果插入空值,可以忽略不写,或者插入null
* 如果插入指定的字段的值,必须写字段名
●修改列名的值(不带条件)
upate 表名 set 列名 = 值;
●修改列名的值(带条件)
update 表名 set 列名 = 值 where 列名= 数值;
●删除
detele from 表名;不推荐,有多少条记录,旧执行多少次的删除,效率低
trancate from 表名 :推荐使用, 删除的整张表,再创建一个新表
4.查询表
●查询表中所有数据
select * from 表名;
●查询表,只显示指定的字段
selcet 指定字段1,指定字段2... from 表名;
●将所有的员工信息查询出来,并将列名改为中文显示
○别名查询,使用关键字‘AS ’
SELECT
eid AS '编号',
ename AS '姓名',
sex AS '性别',
salary AS '薪资',
edate AS '入职日期',
edpt AS '部门'
FROM emp
○查一共有几个部门
select DISTINCT 字段名 from 表名;
○查询所有的员工的工资+1000进行显示
select ename,salary + 1000 from emp;
六、排序(DQL)
●单排
/*select 字段名 from 表名
[where 字段 = 值]
order by 字段名 [ASC/DESC]
*/
SELECT * FROM emp ORDER BY salary DESC
●组合排序
- 同时对多个字段进行排序,如果第一个字段相同,就按照第二个排序
- 需求:薪资是一样的,按编号去排
- SELECT 字段 FROM 表名 ORDER BY 字段名 [DESC],字段名 [ASC]
DQL之聚合函数
-
对数据进行纵向的操作,对某一列的值进行计算,返回一个单一的结果(忽略null值)
-
count(1) 统计某列的行数(null) sum 计算某列数据的和 max 计算该列的最大值 min 计算该列的最小值 avg 计算该列的平均值 -
格式
select 聚合函数(字段名) from 表名;
DQL分组查询
SELECT * FROM emp GROUP BY 字段 [having 条件]
分组,只能显示集合中的第一条数据,因此单纯的使用分组查询是没有实际意义的
所以,经常使用聚合函数和分组结合使用
- SELECT 聚合函数 FROM 表名 GROUP BY 字段(根据该字段进行分组)
SELECT AVG(salary) FROM emp GROUP BY sex;
- 条件
where | where 分组前的过滤,进行条件判断,后面不能跟聚合函数 |
---|---|
having | 分组后的过滤,进行条件判断,后面可以跟聚合函数 |
limit关键字(分页查询)
- limit offset,length
- 格式
-
select 字段 from 表名 limit offset,length offset :从哪开始 默认是0 length :要查询的条数
-
- 查询3条数据
- 分页查询,每次显示2条数据
- 起始索引= (当前页-1) * 每页的条数
- 格式
七、约束
SQL约束
-
什么是约束
- 对表中的数据进行进一步的限制,用来保证数据的正确性、有效性、完整性
-
常见的约束
-
约束 作用 主键 primary key 唯一 unique 非空 not null 外键 foreign key
-
主键
主键概述
-
特点:不可重复 唯一 非空
-
作用:修饰字段
-
语法格式
-
CREATE TABLE s( sid INT PRIMARY KEY, sname VARCHAR(10) ) DROP TABLE s CREATE TABLE s( sid INT, sname VARCHAR(10), -- 单独指定 PRIMARY KEY(sid) ) CREATE TABLE s1( sid INT, sname VARCHAR(5) ) -- 创建的时候不指定主键,通过DDL语句进行设置主键 ALTER TABLE s1 ADD PRIMARY KEY(sid)
-
查看表结构 : desc 表名
-
删除主键:
ALTER TABLE s1 DROP PRIMARY KEY;
- 哪些字段可以作为主键?
- 针对业务去设计主键,每张表都要设计一个主键id
- 主键没有实际的含义,给数据库和程序使用的,跟客户无关
- 主键没有意义没关系,只要保证不重复、非空就可以了
-
主键自增
DROP TABLE s1
CREATE TABLE s1(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(10)
)
INSERT INTO s1 VALUES(NULL,'a')
INSERT INTO s1(sname) VALUE ('b')
主键自增设置初始值
DROP TABLE s1
CREATE TABLE s1(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(10)
)
INSERT INTO s1 VALUES(NULL,'a')
INSERT INTO s1(sname) VALUE ('b')
CREATE TABLE s2(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(10)
)AUTO_INCREMENT=100;
INSERT INTO s2 VALUES(NULL,"a");
INSERT INTO s2 VALUES(NULL,"b")
删除操作对主键的影响
delete | 对自增没有影响 |
---|---|
truncate | 恢复自增初始化值 |
DELETE FROM s2
SELECT * FROM s2
INSERT INTO s2 VALUES(NULL,"a");
INSERT INTO s2 VALUES(NULL,"b")
TRUNCATE TABLE s2
非空约束
-
某一列不能为空
-
格式
-
字段名 字段类型 not null
-
-
学生的名字字段添加非空约束
- 非空和主键区别
-- 非空约束
CREATE TABLE s2(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(20) NOT NULL
)
DESC s2
INSERT INTO s2(sname) VALUE (NULL)
INSERT INTO s2 VALUES(NULL)
唯一约束:字段中的值不能重复(对null不做唯一判断)
- 格式
- 字段名 字段类 unique;
DROP TABLE s2
CREATE TABLE s2(
sname VARCHAR(20) UNIQUE
)
DESC s2
INSERT INTO s2 VALUES('a');
INSERT INTO s2 VALUES('b');
INSERT INTO s2 VALUES(NULL);
设置默认值(列)
DROP TABLE s2
CREATE TABLE s2(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(20),
sex CHAR(1) DEFAULT '女'
)
DESC s2
-- 添加数据,使用默认值
INSERT INTO s2(sname) VALUE ('a')
INSERT INTO s2(sname,sex) VALUE(DEFAULT,'男')
八、事务
事务概述
- 什么是事务
- 是由一条或者多条sql语句组成
- 要么全部成功,要么全部失败(执行回滚)
- 是由一条或者多条sql语句组成
- 回滚(从哪来的回哪去)
- 在事务运行的过程中发生了某个故障,事务便不再继续执行下去,系统对事物中数据所有已完成的
操作全部撤销,滚回到开始时的状态
- 在事务运行的过程中发生了某个故障,事务便不再继续执行下去,系统对事物中数据所有已完成的
CREATE TABLE zh(
id INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(20),
money DOUBLE
)
INSERT INTO zh VALUES(NULL,'小明',1000);
INSERT INTO zh VALUES(NULL,'小王',1000);
-- 转钱操作
UPDATE zh SET money = money - 500 WHERE id = 1;
-- 系统崩了
UPDATE zh SET money = money + 500 WHERE id = 2;
手动提交事务的格式
- 手动提交事务
- 自动的提交事务
开启事务 : start transation;BEGIN
提交事务 : commit
回滚事务 : rollback
START TRANSACTION;
UPDATE zh SET money = money - 500 WHERE id = 1;
崩了
UPDATE zh SET money = money + 500 WHERE id = 2;
SELECT * FROM zh
ROLLBACK
# commit
取消自动提交
SHOW VARIABLES LIKE ‘autocommit’ —查看当前的提交方式
- on :自动提交
- off :手动提交
SHOW VARIABLES LIKE 'autocommit'
SET @@autocommit = off
SELECT * FROM zh
INSERT INTO zh VALUES(NULL,"松江",5)
事务的四大特性
特性 | 含义 |
---|---|
原子性 | 每个事务都是一个整体,不可再拆分。事务中所有的sql要么全部执行成功,要么都失败 |
一致性 | 事务在执行前数据库的状态与执行后数据库的状态保持一致; |
隔离性 | 事务和事务之间不应该相互影响,执行时保持隔离状态 |
持久性 | 一旦事务执行成功,对数据库修改是永久的。就算你关机,数据也会保存下来 |
Mysql的隔离级别(了解)
数据并发访问
- 一个数据库可能有多个客户端在访问,这些客户端都可以并发方式访问数据库,数据库的相同数据可能被多个事务同时访问,如果我们不对其采用隔离,就会发生各种问题,破坏数据的完整性。
数据并发访问产生的问题
并发访问引发的问题 | 含义 |
---|---|
脏读 | 一个事务读取到了另一个事务的尚未提交的数据 |
不可重复读 | 一个事务中两次读取的数据内容不一致 |
幻读 | 一个事务中,某一次的select操作结果所表现得数据状态,无法支撑后续的因为误操作,查询到的数据不准确,导致幻读 |
四种隔离级别
级别 | 名字 | 隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|---|---|
1 | 读未提交 | read uncommitted | 不能 | 不能 | 不能 |
2 | 读已提交 | read committed | 能 | 不能 | 不能 |
3 | 可重复读 | repeatable read | 能 | 能 | 不能 |
4 | 串行化 | serializable | 能 | 能 | 能 |
- 级别效果,执行效率越低
查看隔离级别
SELECT @@tx_isolation/select @@transaction_isolation;
设置隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL 隔离级别
select查询某条记录,不存在,准备插入此纪录;但执行insert时,发现此纪录已经存在了,无法插入
九、外键约束
外键约束概述
-
什么是外键约束
- 指的是从表和主表的主键对应的那个字段
- 使用外键约束可以让两张表之间产生一个对应关系,保证主表引用的完整性
-
多表关系中主从关系?
- 主表:主键id所在的表,约束别人的表
- 从表:外键所在的表,被约束的表
-
修改表结构,添加外键约束
-
alter table 从表 add [CONSTRAINT] [emp_dept_fk两张表关系描述] FOREIGN KEY(外键id) REFERENCES 主表(主键id)
-
-
删除外键
-
alter table 从表 drop FOREIGN KEY 外键约束名称
-
-
建表的时候添加
[CONSTRAINT] [emp_dept_fk两张表关系描述] FOREIGN KEY(外键id) REFERENCES 主表(主键id)
外键约束注意事项
- 从表的外键字段数据类型一定要和主表的主键字段数据类型保持一致
- 添加数据:主表先添加,从表再添加
- 删除数据,应该先删除从表中的数据
- 删除麻烦
级联更新
- 实现删除主表数据的时候,把从表数据也删除掉
- on delete cascade
- 更新主表的数据的时候,将从表的数据也进行更新
- on update cascade
- 注意: 外键建议建立索引;
FOREIGN key(sid) 设置外键,把sid设为外键
REFERENCES stu(sid) 引用作用。引用stu表中的sid
ON DELETE CASCADE 级联删除
ON UPDATE CASCADE 级联更新
十、多表的设计
-
一个项目; 电商 用户 商品表 商品分类
-
多表之间的关系
-
关系 说明 一对一 身份证: person 身份证 主从关系无所谓 一对多 部门 : 一个部门 多个员工 字段多的(数据多了)当从表 字段少的主表 多对多 课程 :中间表当主表 其他多表是从表
多表的查询
-
多表查询的问题
- 笛卡尔积 a{c,d} b{0,1,2} c0,c1,c2 d0,d1,d2
-
内连接查询
-
通过指定的条件去匹配两张表中的数据
-
匹配上就显示,匹配不上就不再显示
- 从表的外键= 主表的主键
-
隐式
-
from字句 后面直接写多个表名,使用where指定的连接条件,具备该特点的方式就被成为隐式内连接查询 注意:where 条件进行无用数据的过滤 语法格式:select 字段 from 左表,右表 where 连接条件 -- 查询商品的名称 价格 以及分类信息
-
-
显示内连接
-
select 字段名 from 左表 [inner] join 右表 on 过滤条件
-
查看所有商品信息
-
-
-
外连接
-
左外
-
left [outer] join
-
以左表为基准,匹配右表中的数据,如果匹配上就显示
-
如果匹配不到,左表中的数据正常显示,右边展示为null
-
select 字段名 from 左表 left [outer] JoIN 右表 on 过滤的条件
-
-
右外
-
right [outer] join on
-
以右表为基准,匹配左表中的数据,匹配上就显示
-
匹配不上,右表数据正常显示,左边为null
-
select 字段名 from 左表 right [outer] JoIN 右表 on 过滤的条件
-
-
各个连接方式总结
-
内连接:inner join ,只获取两张表中的交集部分
-
左外连接:left join ,以左表为基准,查询左表的所有数据,以及和右表的交集数据
-
右外连接:right join ,,以右表为基准,查询右表的所有数据,以及和左表的交集数据
子查询
-
一条select查询语句的结果,作为另外一条select语句的一部分
-
子查询的特点
- 子查询必须在小括号中
- 子查询一般作为父查询的条件去使用
-
子查询的常见分类
- where型子查询:将子查询的结果,作为父查询的比较条件
- from型子查询:将子查询的结果,作为一张表,提供给父层查询使用
- exists型子查询:子查询的结果是单列多行的,类似于一个数组,给父层使用
子查询的结果作为查询条件
select 字段名称 from 表名 where 字段 = (子查询)
子查询的结果作为一张表
select 字段名称 from 表名 (子查询) 别名 where 条件
子查询的结果是单列多行的
-
子查询的结果类似于一个数组,父层查询采用in函数,包含子查询的结果
-
select 字段名称 from 表名 别名 where 字段 in (子查询)
子查询总结
- 子查询如果查询出的是一个字段(单列),那就再where后面作为条件使用
- 子查询如果查询出的是一个表(多列),就当一张表去操作(起别名)
十一、范式
三范式
-
第一规范 1NF
- 原子性,做到列不可在拆分
- 第一范式也是最基本的范式,数据库中表子段都是单一属性,不可拆分
-
第二范式2NF
- 再第一范式基础上更进一步,目标是确保表中的每列和主键相关
- 一张表只能够描述一件事情
-
第三范式3NF
- 消除传递依赖
- 表的信息,如果可以被推导出来,就不应该再单独的去设计一个字段来存放
- 消除传递依赖
数据库反三范式
- 反三范式只等通过增加冗余和重复的数据来提高数据的读性能
- 浪费存储空间,节省了查询时间(以空间换时间)
- 冗余字段
- 设计数据库的时候,某一个字段属于一张表,当它同时出现在另一个表或多个表中,并且完全等同于他在原来所属的意义一样,那么这个字段就被称为一个冗余字段
总结:
- 创建一个关系型数据库设计,我们有两种选择
- 尽量遵循范式理论的规则,尽可能的减少冗余字段,让数据库设计看起来精致、优雅,让人心醉
- 合理的加入冗余字段这个润滑剂,较少join,让数据库执行性能更高更快
十二、索引
MySQL的索引分类
索引名称 | 含义 |
---|---|
主键索引(primary key) | 和主键的含义一样;查询速度快; |
唯一索引(unique) | 索引值是唯一的 |
普通索引 index | 最常见的索引;加快对数据的访问速度 |
- 当我们给字段加上主键约束后,就默认加上了主键索引
- MySQL索引和我们数组的索引是一样的。该索引是加在字段上的,可以让MySQL的查询和运行速度更快
主键索引
-
特点:唯一,非空。每个表只能有一个主键索引。
-
作用:用来标识数据库中的某一条记录
-
ALTER TABLE 表名 ADD PRIMARY KEY(字段名)
-
唯一索引
-
所有的值只能出现一次,必须唯一
-
唯一索引,查询的速度会提高
- 在开发中,通常利用的是唯一索引的“唯一性”
-
创建表的
-
CREATE TABLE demo( did INT , dname VARCHAR(20), hobby VARCHAR(20) unique [索引名称] (字段) )
-
-
使用create语句创建:在已有的表上创建索引
-
CREATE UNIQUE INDEX 索引名称 ON 表名(字段名[长度])
-
-
修改表结构方式添加索引
-
alter table 表名 add unique(字段)
-
-
删除索引
alter table 表名 drop index 名字
-
注意
- mysql将一个表的索引都保存在同一个索引文件中,如果mysql对数据进行增删改操作,mysql都会创建
普通索引
-
目的:有些字段查询/分组使用频率较多,建议该字段作为普通索引*
-
格式
create index 索引名 on 表名(字段(长度)) alter table 表名 add index 索引名称(字段)
总结
- 测试索引的性能:看谁的速度更快
索引的优缺点
- 添加索引首先应考虑在 where 和 order by 涉及的列上做添加
- 索引的优点
- 大大的提高了查询速度
- 可以显著的减少查询中分组和排序的时间
- 索引的缺点
- 创建索引和维护索引需要时间,而且数据量越大时间越长
- 当对表中的数据进行增加、修改、删除的时候,索引也会同时进行维护的,降低了数据的维护速度
十三、视图
-
什么是视图?
- 视图也是数据库的一部分
- 视图是一张虚拟表
- 视图建立在已有表的基础上,这些原基础的视图被称为基表
- 视图提供数据内容语句为select语句,可以将视图理解为存储起来的select语句
- 视图向用户提供基表数据的另一种表现方式
-
视图的作用?
- 权限控制的时候可以使用
- 简化复杂的多表查询
-
创建视图?
-
create view 视图名 [字段] as select 语句
-
SELECT * FROM pc -- 各个分类下商品平均价格 SELECT cname '商品分类', AVG(price) FROM products,category WHERE category_id = cid GROUP BY cname -- 创建视图 CREATE VIEW p_c AS SELECT * FROM products p LEFT JOIN category c ON p.`category_id` = c.`cid`; -- 通过视图查询 SELECT AVG(price) FROM pc GROUP BY cname
-
-
视图和表的区别
- 视图是建立在表之上的,表存储的数据库中的数据,而视图存得是一个数据的展示(select查询语句)
- 通过视图不能改变表中的数据(一般情况下视图中的数据都是表中的列,经过计算得到的结果,不允许更新)
- 删除视图,表不受影响,而删除表,视图不再起作用
十四、存储过程
存储过程概述
-
什么是存储过程?
-
存储过程的优缺点
- 优点
- 存储一旦调试完成后,就可以稳定运行(前提,业务需求要稳定,没有变化)
- 存储过程减少了业务系统和数据库的交互,降低了耦合,数据库交互更加快捷(服务不在同一个地区)
- 缺点
- 在互联网行业中,大量使用mysql,mysql的存储过程与Oracle相比较弱,所以较少使用存储过过程,现在的互联网开发需求变化太快也是原因之一
- 存储过程移植十分困难,数据库集群环境的,保证各个库的存储过程更一致也十分困难
- 阿里的代码规范禁止使用存储过程,维护太麻烦
- 优点
存储过程的创建方式
-
数据准备
- 创建商品 、订单
-
方式一:
delimiter $$ 声明语句的结束符号,可以自定义 一般使用$$ CREATE PROCEDURE 过程的名称() begin -- 开始编写存储过程 -- 执行的操作 end $$
实验:编写存储过程,查询所有的商品数据
-
调用存储过程
-
call 过程的名称;
-
-
-
方式二:
-
IN 输入参数:表示调用者可以向存储过程传入值
-
delimiter $$ 声明语句的结束符号,可以自定义 一般使用$$ CREATE PROCEDURE 过程的名称(IN 参数名 参数类型) begin -- 开始编写存储过程 -- 执行的操作 end $$
-
-
需求 接收一个商品id,根据id做删除
-
DELIMITER $$ CREATE PROCEDURE food(IN id_foods INT) -- in 表示可以接收外部数据 BEGIN -- 存储过程具体封装的业务 DELETE FROM foods WHERE fid = id_foods; END $$ DROP PROCEDURE 存储过程名称 -- 删除存储过程 -- 调用 CALL food(1)
-
-
方式三 创建存储过程(返回值)
-
向订单插入一条数据,返回1表示插如成功
定义变量 set @变量名=值 返回值 out 变量名 数据类型 存储过程声明上
-
总结:
set @变量名=数值
in 输入
out 返回
select @变量名
十五、触发器
-
什么是触发器?
当我们执行一条sql语句的时候,这条sql语句的执行会自动的触发其它的sql语句
-
触发器四要素
- 监视的地点(table)
- 监视事件(inser/update/delete)
- 触发的时间(before /after)
- 触发的事件(insert/update/delete)
-
定义触发器的语法格式
-
delimiter $ 定义触发器的结束符号 ; create trigger 触发器的名称 定义触发器;在同一个数据库中,触发器的名字是唯一的 before/after (inser/update/delete) 触发的时间和监听的事件 on 表名 触发器所在的表 for each row --- 固定写法 叫做触发器行,每一行受影响,触发事件都执行 begin 具体的触发事件(受影响的表和sql语句) end $
-
十六、DCL(控制语言)
-
mysql默认使用的是root账户,超级管理员,拥有全部的无限权限
-
创建用户
-
create user '用户名'@'主机名' IDENTIFIED BY '密码'
参数 含义 用户名 创建的新用户的,登录名称 主机名 指定该用户在哪个主机上可以登录,本机登录localhost,如果想让该用户远程登录的话,通配符 % 密码 -
-
用户授权
-
grant 权限1,权限2,权限3,... on 数据库名.表名 to '用户名'@'主机名'
-
-
查看用户权限
-
show grants for ‘用户名’@'主机名'
-
-
删除用户
-
drop user '用户名'@‘主机名’
-