MySQL笔记
一、前期准备
-
SQL语句分类
DQL - 数据查询语言 --> 查询语句,select 语句都是DQL
DML - 数据操作语言 --> insert、delete、update 等等对表数据进行增删改
DDL - 数据定义语言 --> create、 drop、 alter 等等对表结构的增删改
TCL - 事务控制语言 --> Transaction Commit - 提交事务 Rollback - 回滚事务
DCL - 数据控制语言 --> grant - 授权 revoke - 撤销权限
-
MySQL卸载
去安装目录找到my.ini文件
复制文件中配置的路径:【 datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/" 】
控制面板卸载MySQL
去第二步里复制的路径中删除 C:/ProgramData下的MySQL文件夹
-
常见的cmd命令
打开服务窗口 services.msc
打开/关闭MySQL服务 net start/shut mysql
登录MySQL mysql -uroot -p密码
访问别人的MySQL mysql -h别人IP -uroot -p别人密码
退出MySQL exit/quit
二、DDL -- 对数据库、表的操作
-
操作数据库
-
C(Create):创建
create database 数据库名;
create database if not exists 数据库名;
-- 判断不存在再创建create database 数据库名 character set 字符集名;
-- 创建库并指定字符集练习:
create database if not exists db0 character set utf8;
-
R(Retrieve):查询
show databases;
-- 查询所有的数据库名show create database 数据库名;
-- 查看创建库的语句
-
U(Update):修改
alterdatabase 数据库名 character set 字符集名;
-
D(Delete):删除
drop database 数据库名;
drop database if exists 数据库名;
-- 先判断是否存在
-
使用数据库
-
查询当前正使用的数据库
selsect database();
-
使用数据库
use 数据库名;
-
-
-
操作表
-
C(Create):创建
-
语法:create table 表名(列名1 类型1,
列名2 类型2,
列名3 类型3);
-
数据库数据类型
-
int
-- 整数类型age int
-
double
-- 小数类型-
score double(3, 1);
-- 最多三位,一位小数
-
date
-- 日期 只包含年月日 yyyy- MM-dddatetime
-- 时间戳类型 包含年月日时分秒 yyyy- MM-dd HH:mm:ss-
timestamp
-- 包含年月日时分秒 yyyy- MM-dd HH:mm:ss- 如果不给这个字段赋值或赋值为null,则默认值为系统当前时间
-
varchar
-- 字符串name varchar(20);
张三 8个字符 zhangsan 两个字符
-
复制表 --
create table 表名 like 源表名
练习:
create table t_student( id int, name varchar(30), age int, score double(4,1), birthday date, insert_time timestamp);
-
-
R(Retrieve):查询
-
show tables;
-- 查询当前数据库的所有表-
desc 表名;
-- 查询表结构-
U(Update):修改
-
修改表名
alter table 表名 rename to 新表名
-
修改表字符集
alter table 表名 character set 字符集名;
-
添加一列
alter table 表名 add 列名 类型;
-
修改列名称、类型
alter table 表名 change 列名 新列名 新类型;
alter table 表名 modify 列名 新类型;
-
删除列
-
-
alter table 表名 drop 列名;
-
D(Delete):删除
drop table if exists 表名;
-
三、DML -- 增删改表中数据
-
添加数据
-
语法:
insert into 表名(列名1, 列名2, 列名3...) values(数据1, 数据2, 数据3...);
-
注意!!
前后括号的 列名和值(类型)要一一对应
-
如果表名后不定义列名,则默认给所有列添加值 (也要对应上所有坑,不然报错)
- insert into stu values(2, 'Jones', 18, 90.7, null,null);
除了数值类型,其他的类型都需要是哟个引号括起来【单双引号都可】
-
-
删除数据
-
语法:
delete from 表名 [where 条件 ];
-
注意!!
如果不写条件则会删除表中所有记录
-
如果要删除所有记录,有两种方式:
delete from 表名;
-- 有多少条记录都会一条一条删除掉truncate table 表名;
-- 先删除整张表【包括其数据】,然后创建一张一模一样的空表,效率高
-
-
修改数据
-
语法:
update 表名 set 列名1 = 值1, 列名2 = 值2...[where 条件]
-
注意!!
- 如果不加任何条件,则会将表中所有记录全部修改
-
四、DQL -- 查询语句
-
查询表中记录
-
语法:
select 字段列表 from 表名列表 where 条件列表 group by 分组字段 having 分组之后补充的条件 order by 排序 limit 分页查询
-
基础查询
-
多个字段的查询
-
去除重复
-
select distinct address from stu;
-- 地址重复去除
-
-
起别名
-
-
条件查询
where子句后跟条件
-
运算符
-
<、>、<=、>=、=、<>
-
查询年龄大于20岁的
select * from stu where age > 20;
-
-
beteen...and
查询年龄位于20-30岁的 SELECT * FROM stu WHERE age <= 30 && age >= 20; SELECT * FROM stu WHERE age BETWEEN 20 AND 30; #推荐写法
-
like
模糊查询
-
占位符
_
表示单个任意字符%
表示多个任意字符
举例:
# 查询姓马的记录 第一个字是“马”,其余任意多字无所谓 SELECT s.name, s.math, s.english FROM stu s WHERE s.name LIKE '马%'; # 查询姓名中第二个字是'化'的人 SELECT * from stu where name like '_化%'; # 第一个任意 # 查询姓名有三个字的人 SELECT * FROM stu WHERE NAME LIKE '___'; # 三个下划线 # 查询姓名中包含“马”和“德”的人 SELECT * FROM stu WHERE NAME LIKE "%德%" OR "%马%";
is null
#查询英语成绩为null的列 与不为null的列 SELECT s.name FROM stu s WHERE s.english IS NULL; SELECT s.name FROM stu s WHERE s.english IS NOT NULL;
and 或者 &&
or 或者 ||
# 查询年龄为19 22 25 的 SELECT * FROM stu WHERE age = 19 or age = 22 or age = 25; SELECT * FROM stu WHERE age in(18, 22, 25); #推荐写法
not 或者 !
-
-
排序查询
-
语法:
order by 子句
order by 排序字段1 排序方式1, 排序字段2 排序方式2...
-
排序方式:
asc
:升序【默认】desc
:降序
注意!!如果有多个排序条件,则当前边的条件值一样时,才会执行第二判断条件
-
练习:
# 按照数学成绩排名,如果数学一样,则按照英语成绩排名 SELECT * FROM stu ORDER BY math ASC, english ASC; # 先按照前面的升序,如果前面的一样则再按照后面的升序
-
-
聚合函数 -- 将一列数据作为一个整体,进行纵向的计算
-
count
-- 计算个数- 一般选择主键
max
-- 计算最大值min
-- 计算最小值sum
-- 计算和avg
-- 计算平均数
# 看下英语成绩平均值 SELECT AVG(IFNULL(english, 0)) FROM stu;</pre>
-
注意!!聚合函数计算,是排除null值的
解决方案一:选择不包含null的列进行计算
解决方案二:使用ifnull函数
SELECT COUNT(IFNULL(english, 0)) FROM stu;
-
-
分组查询 -- 统计某一类具有相同特征的数据,把他们看做一个整体
-
语法:
group by分组字段
# 按照性别分组,看下男女同学的平均分 SELECT sex 性别, AVG(IFNULL(math, 0)) 数学平均分, AVG(IFNULL(english, 0)) 英语平均分 FROM stu GROUP BY sex; # 按照性别分组,看下男女同学的平均分 分数低于70的同学不参与分组 SELECT sex, AVG(IFNULL(math, 0)), AVG(IFNULL(english, 0)), COUNT(id) FROM stu WHERE IFNULL(math, 0) > 70 GROUP BY sex; # 按照性别分组,看下男女同学的平均分 分数低于70的同学不参与分组, # 且分组后组内个数小于2的不要了 SELECT sex, AVG(IFNULL(math, 0)), AVG(IFNULL(english, 0)), COUNT(id) FROM stu WHERE IFNULL(math, 0) > 70 GROUP BY sex HAVING COUNT(id) > 2;
-
注意!!
分组之后查询的字段只能是分组字段或者聚合函数了,不能有与个人有关的字段
-
where
与having
的区别where
在分组之前【order by
】进行限定,而having
在分组之后进行限定where
后不可以跟聚合函数,而having
可以
-
-
分页查询
语法:
limit index, n
index -- 开始的索引; n -- 每页查询的条数-
公式:【当前页开始索引 = (当前页数 - 1) * 每页记录条数】
# 每页显示三条,第一页 SELECT * FROM stu LIMIT 0, 3; # 第二页 SELECT * FROM stu LIMIT 3, 3; # 第三页 SELECT * FROM stu LIMIT 6, 3; # 每页开始索引 (当前页数 - 1) * 每页显示条数 = 每页开始索引
分页操作是一个方言 【在MySQL中分页是
limit
,其他数据库有各自额关键字】
-
-
约束
概念:对表中数据进行限定,保证数据的正确性、有效性与完整性
-
约束分类:
主键约束:
primary key
非空约束:
not null
唯一约束:
unique
外键约束:
foreign key
-
主键 -- 该字段值非空且唯一
-
注意!!
一张表只能有一个字段为主键
主键就是表中记录的唯一标识
-
创建表时添加主键
# 创建一个新表,id是主键 create table stu1( id int primary key, name varchar(30) not null # name字段非空 ); # 一个表只能有一个主键
-
删除主键
alter table stu1 drop primary key; # 一个表只有一个主键
-
创建表之后添加主键
# 给 id 字段添加约束主键 alter table stu1 modify id int primary key;
- 添加前删除所有重复字段
-
-
非空 -- 值不能为null
-
创建表时添加非空约束
# 创建一个新表,name字段非空 create table stu1( id int, name varchar(30) not null -- name非空 );
-
删除已经创建的表的非空约束
# 给name字段添加约束非空 alter table stu1 modify name varchar(30) not null;
-
-
唯一 -- 值不能重复
-
创建表时添加
# 创建一个新表,phoneName唯一 CREATE TABLE stu1( id INT, phoneName VARCHAR(20) UNIQUE # phoneName唯一 );
-
创建表之后添加
# 给 phoneName 字段添加约束唯一 alter table stu1 modify phoneName varchar(20) unique;
-
删除表字段的的唯一约束
alter table stu1 drop index phoneName; # 删除表phoneName字段唯一约束
-
注意!!
MySQL中
unique
限定的值可以有多个null删除唯一约束的语法特殊
给已经创建的表的某个字段添加唯一约束时,需要删除掉该字段所有的重复的值
-
-
自动增长
概念:如果某一字段是数值类型,使用
auto_increment
可以实现其自增【一般配合主键id一起使用】-
创建表时添加自增约束
# 创建一个新表,id是主键,且自增 create table stu1( id int primary key auto_increment, name varchar(30) not null -- name字段非空 );
- 注意!!自增的数据只跟上一条记录有关,如id自增到6,插入数据时,指定了id为20 则下一次自增从21开始
-
删除自增约束
# 删除自增约束 alter table stu1 modify id int; # id的主键约束不会被删除掉
-
添加自增约束
# 给 id 字段添加约束自增 alter table stu1 modify id int auto_increment;
-
外键 -- 添加外键前,外键表删除数据不会做检查【比如小李还在A部门,删除A部门不会做检查】
- 在创建表时。可以添加外键
create table 表名( ... 外键列, constraint 外键名 foreign key (外键列名) references 主表名(主表列名) );
- 删除外键
# 删除外键 alter table 本表名 drop foreign key 外键名称;
- 创建表之后,添加外键
alter table 本表名 add constraint 外键名 foreign key (要关联的本表列名) references 外键表名(要关联的外键表列名); # 如下 alter table emp add constraint emp_edp_fk foreign key (dep_id) references dep(id);
- 添加外键,并设置级联更新[ -- 【更改/删除部门的id时,在员工表里自动更改了对应员工的部门号】用的时候谨慎
# 添加外键,并设置级联更新与级联删除 ALTER TABLE emp ADD CONSTRAINT emp_edp_fk FOREIGN KEY (dep_id) REFERENCES dep(id) ON UPDATE CASCADE ON DELETE CASCADE;
- 在创建表时。可以添加外键
五、数据库的设计
-
多表之间的关系
-
分类
-
一对一(了解)
如:人与身份证
一个人只能有一个身份证,一个身份证只能对应一个人
-
一对多(多对一)
如:部门与员工
一个部门可以有多个员工,一个员工只能对应一个部门
-
多对多
如:学生与课程
一个学生可以选择多个课程,一个课程也可以被很多学生选择
-
-
如何实现
-
一对多(多对一)
如:部门与员工
-
MySQL实现:
在多的一方【员工表】建立外键,指向一的一方【部门表】的主键
总结 一对多两张表,多的一方加外键
-
多对多
如:学生与课程
-
MySQL实现:
多对多关系实现需要借助第三张表,此第三话张表至少包含两个字段,这两个字段作为第三张表的外键,分别指向两张表的主键【选课表】
总结 多对多,三张表、关系表俩外键
-
一对一【了解】
- 一对一关系实现,在任意一方添加唯一外键指向另一方主键【直接放一张表吧。。。。】
-
-
-
范式
概念:设计数据库时,遵循不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小
-
分类:(目前关系型数据库有六种范式)
-
第一范式(1NF): 任何一张表应该有主键,且每一个字段原子性不可再分
-
第二范式(2NF): 建立在1NF之上 另外要求所有非主键字段完全依赖主键,不能产生部分依赖 【消除非主字段对主键的部分函数依赖】
-
几个概念
-
函数依赖:A --> B ,如果通过A列的值可以唯一确定列B的值,则称B依赖于A
如 学号 --> 姓名 姓名依赖于学号
(学号,课程) --> 分数 则分数依赖于属性组
-
完全函数依赖: A --> B 如果A是一个属性组,则B值的确认依赖于A中每一个属性
- 如:(学号,课程) -- > 分数 分数的确定单由一个学号无法确定,单由课程也无法确定,一个确定的学号+一个确定的课程确定唯一一个分数
-
部分函数依赖: A --> B 如果A是一个属性组,则B值的确认依只需要依赖于A中某一部分属性
- 如:(学号,系名) --> 姓名。我们发现前面属性组里,通过一个学号可以确定一个姓名,不需要系名,用这个属性组局多余
传递依赖:A --> B, B -- > C,如果通过A属性(组)可以唯一确定B属性的值,再通过B属性(组)的值可以唯一确定C属性(组)的值,则C传递依赖于A
-
-
如:
-
-
第三范式(3NF): 建立在2NF基础上,所有外键字段直接依赖主键,不可产生传递依赖
-
-
数据库的备份与还原
-
命令行形式
-
备份:mysqldump -u用户名 -p密码 要备份的数据库 > 保存的路径
mysqldump -uroot -padmin db1 > D:\JavaSETestDirectory01\MySQLBackup\db1.sql
-
还原:
登录数据库
-
创建数据库【还原的数据装在此数据库】
create database backupdb;
-
使用数据库【进入这个数据库,把数据还原进来】
use backupdb;
-
执行文件。source 文件路径
source D:\JavaSETestDirectory01\MySQLBackup\ddd.sql
-
图形化工具
-
六、多表查询
-
查询语法:
select 列名列表 from 表名列表 where ...
笛卡尔积:两个集合,其所有情况为两个集合列的乘积
消除笛卡尔积:下面三种方式
-
多表查询分类:
-
内连接:
- 隐式内连接:使用where条件消除无用数据
SELECT e.name, # 员工表姓名 e.gender, # 员工表性别 d.name # 部门表名 FROM emp e, dep d WHERE e.dep_id = d.id; # 当员工的部门id与部门的id相等时才返回结果
- 显示内连接:显示地指定连接方式
- 语法:
select 字段列表 from 表1 inner join 表2 on 条件
# 显示连接 查询所有的员工信息与对应的部门信息 SELECT * FROM emp e INNER JOIN dep d ON e.dep_id = d.id; # inner可省略
- 可以看出内连接,查询的是两张表的交集
-
内连接注意事项:
从哪些表中查询数据
条件是什么
查询哪些字段
-
外连接
-
左外连接
- 语法:
select 字段列表 from 表1 left outer join 表2 on 条件 # outer可省略
# 查询所有的员工信息,如果员工有部门,则查询部门名称。没有则不显示部门名 SELECT * FROM emp e LEFT OUTER JOIN dep d ON e.`dep_id` = d.`id`;
-
可以看出--左外连接是查询的左边的表另外与右边表的交集
-
右外连接
- 语法:
select 字段列表 from 表1 right outer join 表2 on 条件 # outer可省略
- 右外连接查询的就是右边的表及其交集
-
-
子查询
概念:查询中嵌套查询,称嵌套查询为子查询
-
案例: -- 查询工资最高的员工信息
# 先查询最高工资是多少 select * from emp where salary = 9000; # 带着最高工资查询信息 # 查询工资最高的员工信息,使用子查询 SELECT * FROM emp WHERE salary = (SELECT MAX(salary) FROM emp);
-
子查询不同情况
-
子查询是单行单列的
- 子查询可以作为条件,使用运算符取判断,运算符【>, <, >=, <=, =】
# 查询工资小于平均工资的员工信息 SELECT * from emp where salary < (SELECT avg(salary) e from emp);
-
子查询是多行单列的
- 子查询作为条件,使用运算符
in
作为判断
- 子查询作为条件,使用运算符
# 查询在开发部或者市场部工作的员工 SELECT * FROM emp WHERE dep_id IN (( SELECT id FROM dep WHERE NAME = "开发部" ), ( SELECT id FROM dep WHERE NAME = "市场部" ));
-
-
* 子查询是多行多列的
# 子查询可以作为一张临时表参与查询
# 查询员工入职日期是 2011-11-11 日之后的员工信息和部门信息
# 使用普通的内连接
SELECT * from emp e, dep d where e.dep_id = d.id and e.join_date > "2011-11-11";
# 使用子查询 多行多列
SELECT * from (select * from emp where emp.join_date > "2011-11-11") t, dep d where t.dep_id = d.id;
-
多表查询练习:
查询所有员工信息。查询员工编号,员工姓名,工资,职务名称,职务描述
查询员工编号,员工姓名,工资,职务名称,职务描述,部门名称,部门位置
查询员工姓名,工资,工资等级
查询员工姓名,工资,职务名称,职务描述,部门名称,部门位置,工资等级
查询出部门编号、部门名称、部门位置、部门人数
查询所有员工的姓名及其直接上级的姓名,没有领导的员工也需要查询
答案:
# 1. 查询所有员工信息。查询员工编号,员工姓名,工资,职务名称,职务描述 select e.id 员工编号, e.ename 员工姓名, e.salary 工资, j.jname 职务名称, j.de 职 务描述 from emp e, job j where e.job_id = j.id; # 2. 查询员工编号,员工姓名,工资,职务名称,职务描述,部门名称,部门位 置 select e.id, e.ename, e.salary, j.jname, j.de, d.dname, d.loc from emp e, dep d, job j where e.dep_id = d.id and e.job_id = j.id; # 3. 查询员工姓名,工资,工资等级 SELECT e.ename, e.salary, s.grade from emp e, salarygrade s where e.salary between s.losalary and s.hissalary; # 4. 查询员工姓名,工资,职务名称,职务描述,部门名称,部门位置,工资等 级 select e.ename, e.salary, j.jname, j.de, d.dname, d.loc, s.grade from emp e, dep d, job j, salarygrade s where e.dep_id = d.id and e.job_id = j.id and e.salary BETWEEN s.losalary and s.hissalary; # 5. 查询出部门编号、部门名称、部门位置、部门人数 /* 分析: · 1. 使用分组查询,对 emp.dep_id 字段进行分组,查询部 门的id与其对应数量 COUNT(emp.id) 作为临时表 t 2. 把 1 中的表拿出来 子查询与 dep 表连接查询部门信息 条件:当临时表的id与部门表id相同时 */ SELECT dep.id 部门编号, dep.dname 部门, dep.loc 部门位置, t.tcount 部门人数 FROM dep, ( SELECT emp.dep_id tid, COUNT(id) tcount FROM emp GROUP BY dep_id ) t WHERE t.tid = dep.id # 6. 查询所有员工的姓名及其直接上级的姓名,没有领导的员工也需要查询 select t1.t1ename 员工姓名, emp.ename 上级领导 from (select ename t1ename,mgr t1mgr from emp) t1 LEFT OUTER JOIN emp on emp.id = t1.t1mgr; -- 更简单的,起别名把员工表看做另一张领导表 SELECT e.ename, e.mgr, m.id, m.ename FROM emp e LEFT OUTER JOIN emp m ON e.mgr = m.id;
七、事务
-
事务介绍
概念一个包含多个步骤的业务操作,被事务管理,那么这些事务要么同时成功,要么同时失败【开启事务后中间某一步出现问题就回滚到所有步骤之前,没有任何异常则提交事务】
-
操作
开启事务:start transaction
回滚:rollback
提交:commit 【如果手动开启了事务但没有手动提交,事务会回滚】
-
MySQL中数据库事务默认自动提交
一条DML(增删改)语句会自动提交一次事务
-
事务提交的两种方式:
自动提交 -- MySQL是自动提交的【Oracle数据库时默认手动提交的(需要写commit)】
手动提交 -- 需要手动start开启事务,然后手动commit提交
-
修改事务的提交方式
-
查看事务默认提交方式:
select @@autocommit; -- 1为自动提交 0 为手动提交
修改默认提交方式:
SET @@autocommit = 0
-
-
事务的四大特征
原子性:事务是不可分割的最小操作单位,要么同时成功,要么同时失败
持久性:事务提交或回滚后,数据会持久化保存【关机,重启应用都已经保存】
隔离性:多个事务之间相互独立【期望互不影响】
一致性:事务操作前后,事务的总量不变【转钱前A100,B100。转钱后A20,B180】
-
事务的隔离级别(了解)
概念:多个事务之间是隔离的、独立的。但是如果多个事务曹组同一批数据,则会引发一些问题,设置不同的隔离级别可以解决这些问题
-
存在的问题:
脏读:一个事务,读取到另一个事务汇总没有提交的数据
(虚 读)不可重复读:在同一个事务中,两次读取到的数据不一样
幻读:一个事务操作(DML)数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改
-
隔离级别:
-
read uncommitted:读未提交
-
产生的问题:脏读、不可重复读、幻读
- 左边事务更改信息还未提交或者回滚,右边读取到更新的信息【比如AB开启事务,A给B转账500,但未提交,B可以看到自己的账户多了500,但是A此时回滚可以把这500不转过去】
-
-
read committed :读已提交【Oracle默认】
-
产生的问题:不可重复读、幻读
- 左边事务提交更新信息,右边事务在提交之前可以看到更新的信息,而不是保持不变
-
-
repeatable read:可重复读【MySQL默认】
- 产生的问题:幻读【左边事务提交更新的信息,但右边事务未提交之前,右边事务读到的数据是不会改变的(实际上已经改变了)。只有在右边事务提交之后才会看到更新的数据信息】
-
serializable:串行化
可以解决所有的问题
一个锁表的操作,一个事务在开启并操作【增删改查】时,其他任何事物不得操作【比如查询时会卡住不动】,只有当前操作事务提交/回滚,别的事务才能操作【效率低】
注意!!隔离级别从小到大安全性愈高,但是效率愈低
-
-
MySQL查询隔离级别
查询:
select @@tx_isolation
修改:
set global transaction isolation level 级别字符串
【级别字符串是上述的read uncommitted
等】
八、DCL -- 控制权限与管理用户
DBA :数据库管理员 -- 管理用户,授权
-
管理用户
-
添加用户:
# 创建用户【使用DCL语句】 # create user "用户名"@"主机名" IDENTIFIED by "密码"; create user "aaa"@"localhost" IDENTIFIED by "123"; -- 这样就可以使用 mysql -uaaa -p123访问这个数据库
-
删除用户:
# 删除用户 # drop user "用户名"@"主机名": drop user "aaa"@"localhost";
-
修改用户密码:
#可行的 # set password for "用户名"@"主机名" = password("新密码"); set password for "aaa"@"localhost" = password("345");
-
```
# update user set PASSWORD = PASSWORD("新密码") where user = "用户名"; update user set PASSWORD = PASSWORD("123") where user = "aaa"; #### 实测不行 =.=
-
如果忘记了自己的登录密码... =.=
停止MySQL服务 cmd -->
net stop mysql
需要管理员权限使用无验证启动MySQL服务:
mysqld --skip-grant- tables
再新打开一个cmd窗口 输入
mysql
回车登录使用 mysql 表,改密码
use mysql; set password for "root"@"localhost" = password("新密码"); # 或者下面这条命令 update user set password = password('新密码') where user = 'root';
关闭两个窗口
打开任务管理器,手动结束
mysqld.exe
进程启动mysql服务。使用新密码登录
-
-
查询用户:
-
切换到
mysql
数据库,用户表是mysql
下的user
表use mysql; show tables; select * from user; #可以发现有两个用户,上面这个是本机登录,第二个是%通配符 任意的【远程登录】
-
-
-
权限管理(权限授予、添加)
-
查询权限
# 查询权限 普通创建的用户只有登录的权限 # show grants for '用户名'@'主机名'; SHOW GRANTS FOR 'aaa'@'localhost';
-
授予权限
# 授予权限 给谁授予哪个数据库的哪个表什么权限 # grant 权限列表 on 数据库名.表名 to '用户名'@'主机名'; GRANT SELECT, UPDATE, DELETE ON db3.emp TO 'aaa'@'localhost';
2.1 授予全部权限
# 授予所有权限,在所有数据库的所有的表上【谨慎使用】 GRANT SELECT, UPDATE, DELETE ON db3.emp TO 'aaa'@'localhost';
-
撤销权限
# 撤销权限 从谁撤销哪个数据库的哪个表什么权限 # revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名'; revoke select on db3.emp from 'aaa'@'localhost';
- 撤销所有权限
revoke all on *.* from 'aaa'@'localhost';
-