数据库常用操作
# 数据库常用操作
# 库相关
创建数据库
create database 数据库名称;
删除数据库
drop database 数据库名称;
创建一个使用 utf8 字符集的名为test的 数据库
create database test character set utf8
创建一个使用 utf8 字符集,并带校对规则的 test_db 数据库
create database test_db character set utf8 collate utf8_bin
校对规则 utf8_bin 区分大小 默认 utf8_general_ci 不区分大小写
查看当前数据库服务器中的所有数据库
show databases;
查看前面创建的test 数据库的定义信息
show create database `test`;
在创建数据库,表的时候,为了规避关键字,可以使用反引号解决
# 备份与恢复
# 备份恢复数据库
备份, 要在 Dos
下执行 mysqldump 指令其实在 mysql 安装目录bin
语法:(-p后面不带密码,回车之后要输入密码)
mysqldump -u 用户名 -p -B 数据库1 数据库2 数据库n > 文件名.sql
例如:(数据库空格之后,再加数据库可以同时备份多个数据库)
mysqldump -u root -proot -B test > d://1.sql
恢复数据库(注意:进入 Mysql 命令行再执行)
mysql> source d://1.sql
第二个恢复方法, 直接将 1.sql 的内容放到查询编辑器中,执行
# 备份恢复数据库的表
备份表:
mysqldump -u 用户名 -p密码 数据库 表1 表2 表n > d:\\文件名.sql
恢复表
mysql> source d://1.sql
# 创建表
create table `user`(
id int,
`name` varchar(255),
`password` varchar(255),
`birthday` date
)character set utf8 collate utf8_bin engine innodb;
2
3
4
5
6
t3的时间会自动更新
mysql> create table birthday (
-> t1 date,
-> t2 datetime,
-> t3 timestamp not null default current_timestamp on update current_timestamp
-> );
insert into birthday (t1,t2) values('2022-09-27','2022-09-27 14:39:20');
2
3
4
5
6
7
# 修改表
# 添加一个name字段
alter table 表名 add (字段名 字段类型,字段名 字段类型);
alter table birthday add name varchar(5) not null;
2
# 查看表结构
desc 表名;
# 修改表字段
alter table birthday modify name varchar(10) not null;
# 删除某列
alter table 表名 drop 字段名;
alter table birthday drop t4;
2
# 修改表名
rename table 旧表名 to 新表名;
rename table birthday to bir;
2
# 修改表的字符集
alter table 表名 character set 字符集编码;
alter table bir character set utf8;
2
# 修改列名
alter table 表名 change 旧字段名 新字段名 类型;
alter table bir change name username varchar(5);
2
# 删除表
drop table 表名;
# 插入数据
insert into bir (t1,t2,username) values('2022-09-27','2022-09-27 19:43:10','张三');
字符和日期型数据应包含在单引号中
列可以插入空值[前提是该字段允许为空]
insert into tab_name (列名..) values (),(),() 形式添加多条记录
INSERT INTO `goods` (id, goods_name, price) VALUES(50, '三星手机', 2300),(60, '海尔手机', 1800);
如果是给表中的所有字段添加数据,可以不写前面的字段名称
INSERT INTO `goods` VALUES(70, 'IBM 手机', 5000);
# 更新数据
update 表名 set 字段名1 = 新值,字段名2 = 新值 ... where
update bir set t1 = '2000-12-12', t2 = '2000-12-12 12:12:12' where username = '张三';
2
# 删除数据
delete from bir where username = '张三';
# 查询语句
查询 * 表示所有字段 FROM 从哪个表
select *
from t1
where name = 'tom'
2
3
要查询的记录,每个字段都相同,才会去重
SELECT DISTINCT `name`, english FROM student;
# 在 select 语句中可使用 as 语句
# where 子句中经常使用的运算符
查询英语分数在 80-90 之间的同学
SELECT * FROM student WHERE english >= 80 AND english <= 90;
SELECT * FROM student WHERE english BETWEEN 80 AND 90; -- between .. and .. 是 闭区间
2
查询数学分数为 89,90,91 的同学。
SELECT * FROM student WHERE math = 89 OR math = 90 OR math = 91;
SELECT * FROM student WHERE math IN (89, 90, 91);
2
# 使用 order by 子句排序查询结果
# 合计/统计函数
count(*) 和 count(列) 的区别
解释 :count(*) 返回满足条件的记录的行数
count(列): 统计满足条件的某列有多少个,但是会排除 为 null 的情况
统计一个班级语文成绩平均分
SELECT SUM(chinese)/ COUNT(*) FROM student;
求一个班级数学平均分
SELECT AVG(math) FROM student;
求班级最高分和最低分
SELECT MAX(math + english + chinese), MIN(math + english + chinese) FROM student;
# 使用 group by 子句对列进行分组
# 使用 having 子句对分组后的结果进行过滤
SELECT AVG(sal), deptno FROM emp GROUP BY deptno HAVING AVG(sal) < 2000;
# 字符串相关函数
# CHARSET(str) 返回字串字符集
SELECT CHARSET(ename) FROM emp;
# CONCAT (string2 [,... ]) 连接字串, 将多个列拼接成一列
SELECT CONCAT(ename, ' 工作是 ', job) FROM emp;
# INSTR (string ,substring )返回 substring 在 string 中出现的位置,没有返回 0
SELECT INSTR('hanshunping', 'ping') FROM DUAL;
# UCASE (string2 ) 转换成大写
SELECT UCASE(ename) FROM emp;
# LCASE (string2 ) 转换成小写
SELECT LCASE(ename) FROM emp;
# LEFT (string2 ,length )从 string2 中的左边起取 length 个字符
# RIGHT (string2 ,length ) 从 string2 中的右边起取 length 个字符
SELECT LEFT(ename, 2) FROM emp;
# LENGTH (string )string 长度
SELECT LENGTH(ename) FROM emp;
# REPLACE (str ,search_str ,replace_str )
-- 在 str 中用 replace_str 替换 search_str
-- 如果是 manager 就替换成 经理
SELECT ename, REPLACE(job,'MANAGER', '经理') FROM emp;
# STRCMP (string1 ,string2 )
逐字符比较两字串大小
SELECT STRCMP('hsp', 'hsp') FROM DUAL;
# SUBSTRING (str , position [,length ])
-- 从 str 的 position 开始【从 1 开始计算】,取 length 个字符
-- 从 ename 列的第一个位置开始取出 2 个字符
SELECT SUBSTRING(ename, 1, 2) FROM emp;
# LTRIM (string2 ) RTRIM (string2 ) TRIM(string)
去除前端空格或后端空格
SELECT LTRIM(' 你好啊') FROM DUAL;
SELECT RTRIM('你好啊 ') FROM DUAL;
SELECT TRIM(' 你好啊 ') FROM DUAL;
2
3
# 数学相关函数
# ABS(num)
绝对值
SELECT ABS(-10) FROM DUAL;
# BIN (decimal_number )十进制转二进制
SELECT BIN(10) FROM DUAL;
# CEILING (number2 ) 向上取整
得到比 num2 大的最小整数
SELECT CEILING(-1.1) FROM DUAL;
# CONV(number2,from_base,to_base)
进制转换
下面的含义是 8 是十进制的 8, 转成 2 进制输出
SELECT CONV(8, 10, 2) FROM DUAL;
下面的含义是 8 是 16 进制的 8, 转成 2 进制输出
SELECT CONV(8, 16, 10) FROM DUAL;
# FLOOR (number2 )
向下取整,得到比 num2 小的最大整数
SELECT FLOOR(-1.1) FROM DUAL;
# FORMAT (number,decimal_places )
保留小数位数(四舍五入)
SELECT FORMAT(78.125458,2) FROM DUAL;
# HEX (DecimalNumber )
# LEAST (number , number2 [,..])
SELECT LEAST(0,1, -10, 4) FROM DUAL;
# MOD (numerator ,denominator )
求余
SELECT MOD(10, 3) FROM DUAL;
# RAND([seed])
RAND([seed]) 返回随机数 其范围为 0 ≤ v ≤ 1.0
-- 1. 如果使用 rand() 每次返回不同的随机数 ,在 0 ≤ v ≤ 1.0
-- 2. 如果使用 rand(seed) 返回随机数, 范围 0 ≤ v ≤ 1.0, 如果 seed 不变,
-- 该随机数也不变了
SELECT RAND() FROM DUAL;
# 时间日期相关函数
# CURRENT_DATE ( )
当前日期
SELECT CURRENT_DATE() FROM DUAL;
# CURRENT_TIME ( )
当前时间
SELECT CURRENT_TIME() FROM DUAL;
# CURRENT_TIMESTAMP ( )
当前时间戳
SELECT CURRENT_TIMESTAMP() FROM DUAL;
-- 显示所有新闻信息,发布日期只显示 日期,不用显示时间.
SELECT id, content, DATE(send_time) FROM mes;
-- 请查询在 10 分钟内发布的新闻, 思路一定要梳理一下.
SELECT *
FROM mes
WHERE DATE_ADD(send_time, INTERVAL 10 MINUTE) >= NOW()
SELECT *
FROM mes
WHERE send_time >= DATE_SUB(NOW(), INTERVAL 10 MINUTE)
2
3
4
5
6
-- 请在 mysql 的 sql 语句中求出 2011-11-11 和 1990-1-1 相差多少天
SELECT DATEDIFF('2011-11-11', '1990-01-01') FROM DUAL;
-- 请用 mysql 的 sql 语句求出你活了多少天? [练习] 1986-11-11 出生
SELECT DATEDIFF(NOW(), '1986-11-11') FROM DUAL;
-- 如果你能活 80 岁,求出你还能活多少天.[练习] 1986-11-11 出生
-- 先求出活 80 岁 时, 是什么日期 X
-- 然后在使用 datediff(x, now()); 1986-11-11->datetime
-- INTERVAL 80 YEAR : YEAR 可以是 年月日,时分秒
-- '1986-11-11' 可以 date,datetime timestamp
SELECT DATEDIFF(DATE_ADD('1986-11-11', INTERVAL 80 YEAR), NOW()) FROM DUAL;
SELECT TIMEDIFF('10:11:11', '06:10:10') FROM DUAL;
2
-- YEAR|Month|DAY| DATE (datetime )
SELECT YEAR(NOW()) FROM DUAL;
SELECT MONTH(NOW()) FROM DUAL;
SELECT DAY(NOW()) FROM DUAL;
SELECT MONTH('2013-11-10') FROM DUAL;
2
3
4
-- unix_timestamp() : 返回的是 1970-1-1 到现在的秒数
SELECT UNIX_TIMESTAMP() FROM DUAL;
-- FROM_UNIXTIME() : 可以把一个 unix_timestamp 秒数[时间戳],转成指定格式的日期
-- %Y-%m-%d 格式是规定好的,表示年月日
-- 意义:在开发中,可以存放一个整数,然后表示时间,通过 FROM_UNIXTIME 转换
--
SELECT FROM_UNIXTIME(1618483484, '%Y-%m-%d') FROM DUAL;
SELECT FROM_UNIXTIME(1618483100, '%Y-%m-%d %H:%i:%s') FROM DUAL;
SELECT * FROM mysql.user \G
2
3
# 加密和系统函数
# user()
可以查看登录到 mysql 的有哪些用户,以及登录的 IP
用户@IP 地址
SELECT USER() FROM DUAL;
# DATABASE()
查询当前使用数据库名称
select database();
# MD5(str)
为字符串算出一个 MD5 32 的字符串,常用(用户密码)加密
root 密码是 abc -> 加密 abc -> 在数据库中存放的是加密后的密码
select md5('abc') from dual;
# PASSWORD(str)
加密函数
MySQL 数据库的用户密码就是 PASSWORD 函数加密 (测试未使用成功)
SELECT PASSWORD('abc') FROM DUAL;
从原文密码 str 计算并返回密码字符串
select * from mysql.user \G
通常用于对 mysql 数据库的用户密码加密
mysql.user 表示 数据库.表
# 流程控制函数
# IF(expr1,expr2,expr3)
如果 expr1 为 True ,则返回 expr2 否则返回 expr3
SELECT IF(TRUE, '北京', '上海') FROM DUAL;
# IFNULL(expr1,expr2)
如果 expr1 不为空 NULL,则返回 expr1,否则返回 expr2
SELECT IFNULL( NULL, '哈哈哈哈') FROM DUAL;
# SELECT CASE WHEN expr1 THEN expr2 WHEN expr3 THEN expr4 ELSE expr5 END;
如果 expr1 为 TRUE,则返回 expr2,如果 expr2 为 t, 返回 expr4, 否则返回 expr5
SELECT CASE
WHEN TRUE THEN 'jack'
WHEN FALSE THEN 'tom'
ELSE 'mary' END;
2
3
4
# 分页查询
按雇员的 id 号升序取出, 每页显示 3 条记录,请分别显示 第 1 页,第 2 页,第 3 页
-- 第 1 页
SELECT * FROM emp ORDER BY empno LIMIT 0, 3;
-- 第 2 页
SELECT * FROM emp ORDER BY empno LIMIT 3, 3;
-- 第 3 页
SELECT * FROM emp ORDER BY empno LIMIT 6, 3;
-- 推导一个公式
SELECT * FROM emp ORDER BY empno LIMIT 每页显示记录数 * (第几页-1) , 每页显示记录数
2
3
4
5
6
7
8
9
# 数据分组
# 多表查询
多表查询的条件不能少于 表的个数-1, 否则会出现笛卡尔集
# 自连接
自连接是指在同一张表的连接查询
自连接的特点
1. 把同一张表当做两张表使用
需要给表取别名 表名 表别名
列名不明确,可以指定列的别名 列名 as 列的别名
SELECT worker.ename AS '职员名' , boss.ename AS '上级名'
FROM emp worker, emp boss
WHERE worker.mgr = boss.empno;
2
3
# 子查询
子查询是指嵌入在其它 sql 语句中的 select 语句,也叫嵌套查询
单行子查询是指只返回一行数据的子查询语句
多行子查询指返回多行数据的子查询 使用关键字 in
在多行子查询中使用 all 操作符
SELECT ename, sal, deptno FROM emp
WHERE sal > ALL( SELECT sal FROM emp WHERE deptno = 30 )
-- 可以这样写
SELECT ename, sal, deptno FROM emp
WHERE sal > ( SELECT MAX(sal) FROM emp WHERE deptno = 30 )
SELECT ename, sal, deptno FROM emp
WHERE sal > any( SELECT sal FROM emp WHERE deptno = 30 )
2
3
4
5
6
7
8
# 外连接
-- 改成左外连接
SELECT `name`, stu.id, grade FROM stu LEFT JOIN exam ON stu.id = exam.id;
-- 使用右外连接(显示所有成绩,如果没有名字匹配,显示空)
-- 即:右边的表(exam) 和左表没有匹配的记录,也会把右表的记录显示出来
SELECT `name`, stu.id, grade FROM stu RIGHT JOIN exam ON stu.id = exam.id;
2
3
4
5
# 表复制
# 自我复制数据
INSERT INTO my_tab01 (id, `name`, sal, job,deptno)
SELECT empno, ename, sal, job, deptno FROM emp;
-- 2. 自我复制
INSERT INTO my_tab01 SELECT * FROM my_tab01;
2
3
4
# 如何删除掉一张表重复记录
(1) 先创建一张临时表 my_tmp , 该表的结构和 my_tab02 一样
(2) 把 my_tmp 的记录 通过 distinct 关键字 处理后 把记录复制到 my_tmp
(3) 清除掉 my_tab02 记录
(4) 把 my_tmp 表的记录复制到 my_tab02
(5) drop 掉 临时表 my_tmp
-- (1) 先创建一张临时表 my_tmp , 该表的结构和 my_tab02 一样
create table my_tmp like my_tab02
-- (2) 把 my_tab02 的记录 通过 distinct 关键字 处理后 把记录复制到 my_tmp
insert into my_tmp select distinct * from my_tab02;
-- (3) 清除掉 my_tab02 记录
delete from my_tab02;
-- (4) 把 my_tmp 表的记录复制到 my_tab02
insert into my_tab02 select * from my_tmp;
-- (5) drop 掉 临时表 my_tmp
drop table my_tmp;
select * from my_tab02;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 合并查询
-- union all 就是将两个查询结果合并,不会去重
SELECT ename,sal,job FROM emp WHERE sal>2500
UNION ALL SELECT ename,sal,job FROM emp WHERE job='MANAGER'
-- union 就是将两个查询结果合并,会去重
SELECT ename,sal,job FROM emp WHERE sal>2500
UNION
SELECT ename,sal,job FROM emp WHERE job='MANAGER'
2
3
4
5
6
7
# mysql 约束
# primary key(主键)
字段名 字段类型 primary key
用于唯一的标示表行的数据,当定义主键约束后,该列不能重复
- primary key不能重复而且不能为null。
- 一张表最多只能有一个主键,但可以是复合主键主键的指定方式有两种
- 直接在字段名后指定:字段名primakry key在表定义最后写 primary key(列名);
- 使用desc表名,可以看到primary key的情况.
- 在实际开发中,每个表往往都会设计一个主键.
CREATE TABLE t18 (id INT PRIMARY KEY) -- 表示 id 列是主键
-- 演示复合主键 (id 和 name 做成复合主键)
CREATE TABLE t18 (id INT , `name` VARCHAR(32), email VARCHAR(32), PRIMARY KEY (id, `name`) );
-- 这里就是复合主键 );
2
3
4
# not null(非空)
如果在列上定义了not null,那么当插入数据时,必须为列提供数据。
# unique(唯一)
当定义了唯一约束后,该列值是不能重复的。
- 如果没有指定not null,则unique字段可以有多个null
- 一张表可以有多个unique字段
# foreign key(外键)
-- 创建 主表 my_class
CREATE TABLE my_class ( id INT PRIMARY KEY , -- 班级编号
`name` VARCHAR(32) NOT NULL DEFAULT '');
-- 创建 从表 my_stu
CREATE TABLE my_stu ( id INT PRIMARY KEY , -- 学生编号
`name` VARCHAR(32) NOT NULL DEFAULT '',
class_id INT , -- 学生所在班级的编号
-- 下面指定外键关系
FOREIGN KEY (class_id) REFERENCES my_class(id)
)
2
3
4
5
6
7
8
9
10
# check
-- 测试
CREATE TABLE t23 (
id INT PRIMARY KEY,
`name` VARCHAR(32) ,
sex VARCHAR(6) CHECK (sex IN('man','woman')),
sal DOUBLE CHECK ( sal > 1000 AND sal < 2000)
);
2
3
4
5
6
7
# MySql索引
# 创建索引
CREATE INDEX 索引名称 ON 表名 (字段名);
CREATE INDEX empno_index ON emp (empno);
CREATE INDEX ename_index ON emp (ename) -- 在 ename 上创建索引
2
3
# 索引的类型
# 索引使用
-- 查询表是否有索引
SHOW INDEXES FROM t25;
-- 添加索引
-- 添加唯一索引
CREATE UNIQUE INDEX id_index ON t25 (id);
-- 添加普通索引方式 1
CREATE INDEX id_index ON t25 (id);
-- 如何选择
-- 1. 如果某列的值,是不会重复的,则优先考虑使用 unique 索引, 否则使用普通索引
-- 添加普通索引方式 2
ALTER TABLE t25 ADD INDEX id_index (id)
-- 添加主键索引
CREATE TABLE t26 ( id INT , `name` VARCHAR(32));
ALTER TABLE t26 ADD PRIMARY KEY (id) ;
SHOW INDEX FROM t25;
-- 删除索引
DROP INDEX id_index ON t25;
-- 删除主键索引
ALTER TABLE t26 DROP PRIMARY KEY;
-- 修改索引 , 先删除,在添加新的索引
-- 查询索引
-- 1. 方式
SHOW INDEX FROM t25;
-- 2. 方式
SHOW INDEXES FROM t25;
-- 3. 方式
SHOW KEYS FROM t25;
-- 4 方式
DESC t25;
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
# mysql 事务
# 事务和锁
-- 1. 创建一张测试表
CREATE TABLE t27 ( id INT, `name` VARCHAR(32));
-- 2. 开始事务
START TRANSACTION
-- 3. 设置保存点
SAVEPOINT a
-- 执行 dml 操作
INSERT INTO t27 VALUES(100, 'tom');
SELECT * FROM t27;
SAVEPOINT b
-- 执行 dml 操作
INSERT INTO t27 VALUES(200, 'jack');
-- 回退到 b
ROLLBACK TO b
-- 继续回退 a
ROLLBACK TO a
-- 如果这样, 表示直接回退到事务开始的状态.
ROLLBACK
COMMIT
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 回退事务
在介绍回退事务前,先介绍一下保存点(savepoint),保存点是事务中的点.用于取消部分事务,当结束事务时(commit),会自动的删除该事务所定义的所有保存点当执行回退事务时,通过指定保存点可以回退到指定的点,这里我们作图说明
# 提交事务
使用commit语句可以提交事务.当执行了commit语句子后,会确认事务的变化、结束事务、删除保存点、释放锁,数据生效。当使用commit语句结束事务子后,其它会话[其他连接]将可以查着到事务变化后的新数据[所有数据就正式生效.]
# mysql 事务隔离级别
多个连接开启各自事务操作数据库中数据时,数据库系统要负责隔离操作,以保证各个连接在获取数据时的准确性。
如果不考虑隔离性,可能会引发如下问题:
- 脏读
- 不可重复读
- 幻读
# 事务隔离级别
# 设置事务隔离级别
-- 1. 开了两个 mysql 的控制台
-- 2. 查看当前 mysql 的隔离级别
SELECT @@tx_isolation;
-- mysql> SELECT @@tx_isolation;
-- +-----------------+
-- | @@tx_isolation |
-- +-----------------+
-- | REPEATABLE-READ |
-- +-----------------+
-- 3.把其中一个控制台的隔离级别设置
Read uncommitted SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
-- 4. 创建表
CREATE TABLE `account`( id INT, `name` VARCHAR(32), money INT);
-- 查看当前会话隔离级别
SELECT @@tx_isolation -- 查看系统当前隔离级别
SELECT @@global.tx_isolation
-- 设置当前会话隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
-- 设置系统当前隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL [你设置的级别]
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# mysql 事务 ACID
# mysql 表类型和存储引擎
-- 表类型和存储引擎
-- 查看所有的存储引擎
SHOW ENGINES
-- innodb 存储引擎,是前面使用过.
-- 1. 支持事务 2. 支持外键 3. 支持行级锁
-- myisam 存储引擎
CREATE TABLE t28 ( id INT, `name` VARCHAR(32)) ENGINE MYISAM
-- 1. 添加速度快 2. 不支持外键和事务 3. 支持表级锁
-- memory 存储引擎
-- 1. 数据存储在内存中[关闭了 Mysql 服务,数据丢失, 但是表结构还在]
-- 2. 执行速度很快(没有 IO 读写) 3. 默认支持索引(hash 表)
CREATE TABLE t29 ( id INT, `name` VARCHAR(32)) ENGINE MEMORY
DESC t29
INSERT INTO t29 VALUES(1,'tom'), (2,'jack'), (3, 'hsp');
SELECT * FROM t29
-- 指令修改存储引擎
ALTER TABLE `t29` ENGINE = INNODB
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 修改存储引擎
# 视图(view)
视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含列,其数据来自对应的真实表(基表)
# 视图的基本使用
-- 创建视图
create view bir_view as select t1,t2,t3 from bir;
-- 查看视图
desc bir_view;
-- 查看创建视图的指令
show create view bir_view;
-- 删除视图
DROP VIEW bir_view;
-- 视图的细节
-- 1. 创建视图后,到数据库去看,对应视图只有一个视图结构文件(形式: 视图名.frm)
-- 2. 视图的数据变化会影响到基表,基表的数据变化也会影响到视图[insert update delete ]
-- 修改视图 会影响到基表
-- 修改基本表, 会影响到视图
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Mysql 管理
# 创建用户
create user 'testuser' @localhost identified by '123';
-- 创建用户 zhangsan 密码 123 , 从本地登录
CREATE USER 'zhangsan'@'localhost' IDENTIFIED BY '123';
-- create user 'xxx'@'192.168.1.%' 表示 xxx 用户在 192.168.1.*的 ip 可以登录 mysql
CREATE USER 'smith'@'192.168.1.%'
2
3
4
5
# 删除用户
drop user 'testuser' @localhost;
-- 删除 zhangsan
DROP USER 'zhangsan'@'localhost'
-- 在删除用户的时候,如果 host 不是 %, 需要明确指定 '用户'@'host 值'
DROP USER jack -- 默认就是 DROP USER 'jack'@'%'
DROP USER 'smith'@'192.168.1.%'
2
3
4
5
6
7
# 用户修改密码
SET PASSWORD FOR 'zhangsan'@'localhost' = PASSWORD('abc');
# 给用户授权
-- 给 zhangsan 分配查看 news 表和 添加 news 的权限
GRANT SELECT , INSERT ON testdb.news TO 'zhangsan'@'localhost';
-- 可以增加 update 权限
GRANT UPDATE ON testdb.news TO 'zhangsan'@'localhost';
2
3
4
# 回收用户授权
-- 回收 shunping 用户在 testdb.news 表的所有权限
REVOKE SELECT , UPDATE, INSERT ON testdb.news FROM 'zhangsan'@'localhost'
REVOKE ALL ON testdb.news FROM 'zhangsan'@'localhost
2
3