优快云 的小伙伴们,大家好,这是我写的第一篇博客文章,记录一下自己学习 MySQL 数据库中的一些笔记。内容有写的不对或者不太清楚的地方欢迎在评论区留言,“三人行,必有我师焉!”,让我们在学习的过程中共同进步!
MySQL 入门
什么是数据库
数据库就是用来保存和管理数据的
简单示意图:
MySQL数据库的安装和配置
官网下载地址:https://dev.mysql.com/downloads/
安装方式有两种:第一种是解压版(免安装),另一种是安装包(.exe文件)
添加环境变量:此电脑 -> 属性 -> 高级系统设置 -> 环境变量 -> path
安装 mysql :mysql -install
初始化数据库:mysqld -initialize -insecure
启动 mysqld 服务:net start mysql
停止 mysqld 服务:net stop mysql
进入 mysql 管理终端:mysql -u root -p(当前密码为空)
刷新权限:flush privileges;
修改 root 用户密码:
use mysql;
update user set authentication_string=password('root的密码') where user='root' and Host='localhost';
- 使用命令行窗口(建议以管理员身份运行)连接 MySQL 数据库(很重要)
net start mysql
mysql -h 主机名 -P 端口号 -u 用户名 -p密码(-p密码之间不要有空格!!!)
- Navicat 安装和使用(推荐和命令行窗口一同使用)
一款图形化的 MySQL 管理软件
官网下载地址:https://www.navicat.com.cn/products(试用版) - SQLyog (海豚)安装和使用
官网下载地址:https://sqlyog.en.softonic.com/
MySQL三层结构
-
数据在数据库中的存储方式
表(table),列(column),行(row) -
SQL语句分类
DDL:数据定义语句。create
DML:数据操作语句。insert,update、delete
DQL:数据控制语句。select
DCL:数据查询语句。grant、revoke等
创建、删除、查询和备份恢复数据库
- 创建指令:
create database db_name;
- 删除指令:
drop database db_name;
- character set:指定字符集,默认utf8
- collate:字符集校对规则,默认utf8_general_ci(不区分大小写),常用utf8_bin(区分大小写)
- 显示数据库:
show databases
- 显示已创建的数据库:
show database db_name
- 删除数据库(慎用):
drop database [if exists] db_name
- 备份(在 DOS 中执行):
mysqldump -u root -p -B 数据库1 数据库2 ... > 指定 sql 文件
- 恢复(进入 Mysql 命令行再执行):
source 文件名.sql
- 备份库的表:m
ysqldump -u 用户名 -p密码 数据库 表1 表2 ... > 指定 sql 文件
创建表
- 指令:
create table table_name(field2 datatype, field2 datatype, ..., )character set 字符集 collate 校对规则 engine 引擎;
field:指定列名
datatype:指定列类型(字段类型)
例: -
MySQL常用数据类型(重点)
- 整型如果没有指定 unsigned ,则默认有符号
- bit(m) 字段显示时,按照位的方式显示,查询时可以使用添加的数值
- decimal(M, D)支持更加精确的小数位,如果 D 是 0 ,则数值没有小数点部分,M 最大是 65 ,D 最大是 30 ,如果 D 被省略,默认是 0 ,如果 M 被省略,默认是 10。 如果希望小数的精度更高,推荐使用 decimal
- 字符串的基本使用:char(),固定长度字符串,最大 255 字节;varchar(),可变长度字符串,最大65532字节(utf8 编码最大 21844 字符(3个字节=1个字符),1-3字节用于记录字符串大小)
- 字符串使用细节:char 和 varchar 不管是中文汉字还是英文字母,都是按照字符来存放的。char 是定长,varchar 是变长,按照实际占用空间来分配(varchar 本身还需要占用 1-3 字节来记录存放内容长度)。一般情况下,char 的查询速度比 varchar 要快。如果 varchar 长度不够用,可以考虑使用 mediumtext 或 longtext 。在存放文本时,也可以使用 text 数据类型,可以将 text 列视为 varchar 列
- 日期类型的基本使用:
- 创建表练习
修改表(重点)
- 使用 alter table 语句追加,修改,或删除列的语法:
alter table 表名 add 添加的列 datatype not null default '';
alter table 表名 modify 修改的列 datatype not null default '';
alter table 表名 drop 删除的列 datatype not null default '';
查看表的结构:desc 表名;
修改表名:rename table 表名 to 新表名;
修改字符集:alter table character set utf8;
修改列的名称:alter table 表名 change 列名 新列名 datatype not null default '';
数据库C[create]R[read]U[update]D[delete]语句(重点)
- Insert 语句:添加数据
- Update 语句:更新数据
- Delete 语句:删除数据
- Select 语句:查询数据
Insert 语句
insert into table_name (column, ...) values (value, ...);
insert 注意事项:
- 插入的数据应与字段的数据类型相同
- 数据的长度应在列的规定范围内
- 在 values 中列出的数据位置必须与被加入的列的排列位置相对应
- 字符和日期类型的数据应包含在单引号内
- 列可以插入空值,前提是该字段允许为空
- insert 语句可以同时添加多条记录
- 如果是给表中的所有字段添加数据,可以不写前面的字段名称
- 默认值的使用,当不给某个字段添加数据时,如果有默认值就会自动添加默认值,否则报错
update 语句
update tb_name set col_name = expr, ... where 条件;
使用细节:
- update 语句可以用新值更新原有字段的值
- set 子句指出要修改的列和给予的值
- where 子句制定要更新哪些行,如果没有 where 子句,则更新所有行(慎用)
- 如果需要同时修改多个字段,可以通过
set 字段1 = 值1, 字段2 = 值2, ...
delete 语句
delete from tb_name where 条件; //删除表中的数据
使用细节:
- 如果不使用 where 子句,将删除表中所有数据
- delete 语句不能删除某一列的值
- 使用 delete 语句仅能删除记录,不能删除表本身,如要删除表,使用 drop 语句:
drop table 表名;
select 语句(重点)
select [distinct] * | { column1, column2, column3, ... } from table_name; //distinct 关键字的作用是去重
- select 语句中可使用表达式对查询的列进行运算
- select 语句中可使用 as 语句:
select column_name as 别名 from 表名;
- 在 where 子句中经常使用的运算符:
运算符 | 用法 |
---|---|
>、 <、 >=、 <=、 =、 <>和!= | 大于、小于、大于等于、小于等于、等于、不等于 |
between …and… | 显示在某一区间的值 |
in(set) | 显示在 in 列表中的值 |
like ’ ’ 、not like ’ ’ | 模糊查询 |
is null | 判断是否为空 |
and | 多个条件同时成立 |
or | 多个条件任一成立 |
not | 不成立 |
使用 where 子句,进行过滤查询:
- 查询姓名为张三的学生成绩
- 查询英语成绩大于 90 分的同学
- 查询总分大于 200 分的所有同学
使用 order by 子句排序查询结果:
select column1, column2, column3, ... from tb_name order by column asc | desc;
- order by 指定排序的列,asc 升序(默认),desc 降序
- order by 子句应位于select 语句的结尾
- 对数学成绩排序后输出(升序)
- 对总分按从高到低的顺序输出
- 对姓张的学生是成绩总分排序输出(升序)
函数(重点)
统计函数
- count:返回行的总数
select count(*) | count (列名) from table_name where 条件;
count(*) 和 count(列名) 的区别:前者返回满足条件的记录的行数,后者统计满足条件的某列有几个,但是会排除为 null 的情况
- sum:返回满足 where 条件的列的和,一般使用在数值
select sum(列名), ... from table_name where 条件;
- avg:返回满足 where 条件的一列的平均值
select avg(列名), ... from table_name where 条件;
- Max / Min:返回满足条件的某列的最大 / 最小值(数值范围在统计中特别有用)
select max(列名) from table_name where 条件;
分组统计
- 使用 group by 子句对列进行分组,用于对查询的结果分组统计
select column1, column2, ... from table group by column;
- 使用 having 子句对分组后的结果进行过滤,用于限制分组显示结果
select column1, column2, ... from table group by column having ... ;
- 思考:having 和 where 的区别?
字符串相关函数
charset(str) | 返回子串字符集 |
---|---|
concat(str, … ) | 连接字串 |
instr(str, substr) | 返回 substr 在 str 中出现的位置 |
ucase(str) | 转换成大写 |
lcase(str) | 转换成小写 |
left(str, length) | 从 str 中的左边起取 length 个字符 |
right(str, length) | 从 str 中的右边起取 length 个字符 |
length(str) | 统计 str 长度(按照字节) |
replace(str, search_str, replace_str) | 在 str 中用 replace_str 替换 search_str |
strcmp(str1, str2) | 逐个字符比较大小 |
substring(str, position, length) | 从 str 的 position 开始(从 1 开始计算),取出 length 个字符 |
ltrim(str) 、rtrim(str) 、trim(str) | 去除空格 |
数学函数
abs(num) | 求绝对值 |
---|---|
bin() | 十进制转二进制 |
ceiling(num) | 向上取整,返回比 num 大的最小整数 |
conv() | 进制转换,如 conv(8, 10, 2) 得到 1000,conv(16, 16, 10) ,得到22 |
floor(num) | 向下取整,返回比 num 小的最大整数 |
format() | 保留小数位数(四舍五入) |
hex() | 转十六进制 |
least() | 求最小值 |
mod() | 求余,如 mod(10, 3) 得到 1 |
rand() | 返回一个随机数,其范围为 [ 0, 1 ] ,如果使用 rand() ,每次返回不同的随机数;如果使用 rand(seed) ,返回一个随机数,若 seed 不变,则该随机数也不变 |
日期函数
current_date | 当前日期 |
---|---|
current_time | 当前时间 |
current_timestamp | 当前时间戳 |
date_(datetime) | 返回 datetime 的日期部分 |
date_add(date2, interval d_value d_type) | 加上一个时间,interval 后面的 d_type 可以是年、月、日、时、分、秒 |
date_sub() | 减去一个时间 |
datediff(date1, date2) | 两个日期差(结果是天),date1 - date2 |
timediff(time1, time2) | 两个时间差(多少小时多少分钟多少秒) |
now() | 当前时间,年月日时分秒 |
year month day date(datetime) | 当前的年或月或日 |
unix_timestamp() | 返回的是 1970-1-1 00:00:00 到现在的秒数 |
from_unixtime() | 把一个 unix_timestamp 秒数,转成指定格式的日期,%Y-%m-%d %H:%i:%s |
在实际开发中,可以存放一个整数表示时间,通过 from_unixtime 转换,经常使用 int 来保存一个 unix 时间戳
加密函数和系统函数
user() | 查询用户 |
---|---|
datebase() | 查询当前使用的数据库名称 |
md5(str) | 为字符串算出一个 md5 32 的加密字符串,常用于(用户密码)加密。在数据库中存放的是加密后的密码 |
password(str) | 加密函数,MySQL 数据库的用户密码使用 password 函数加密的 |
MySQL 5.7.9 版本后废除了 password 字段和 password() 函数
流程控制函数
if(expr1, expr2, expr3) | 如果 expr1 为真,则返回 expr2 ,否则返回 expr3 |
---|---|
ifnull(expr1, expr2) | 如果 expr1 不为空,则返回 expr1 本身,否则返回 expr2 |
select case when expr1 then expr2 when expr3 then expr4 else expr5 end; | 如果 expr1 为真, 则返回 expr2,如果expr3 为真,则返回 expr4,否则返回 expr5 ,结束 |
判断是否为 null ,要使用 is null ;判断不为空,使用 is not null
内连接
查询增强
- 在 mysql 中,日期类型也可以直接比较,但要注意日期格式
- like 操作符:% 表示 0 到多个任意字符,_ 下划线表示单个任意字符
- 判断为空使用
is null
- 查询表结构:
desc 表名;
分页查询
- 基本语法:
select ... limit start, rows; //表示从 start + 1 行开始取,取出 rows 行,start 从0 开始计算。公式,limit 每页显示记录数*(第几页 - 1),每页显示记录数
分组增强
- 使用分组函数和分组子句 group by
- count() 只统计非空字段
多字句查询
- 数据分组的总结:如果 select 语句同时包含有 group by,having,limit,order by,那么它们的顺序是group by,having,order by,limit,即分组 -> 过滤 -> 排序 -> 分页查询
外连接(重点)
多表查询
- 笛卡尔积
多表查询默认处理返回的结果成为笛卡尔积,假设是有两张表,返回的结果就是两张表的行数之积
解决多表的关键是要写出正确的过滤条件 where 子句
表名.列名:指定显示某个特定表的列 - 自连接
指在同一张表的连接查询,将同一张表当做两张表
特定的:1、同一张表当做两张表使用
2、需要给每张表都取别名,表别名和列别名 - 多行子查询
子查询是指嵌入在其它 SQL 语句中的 SQL 语句,也叫嵌套查询
单行子查询是指只返回一行数据的子查询语句
多行自查询是指返回多行数据的子查询,使用关键字 in - 子查询临时表
把子查询当做临时表使用 - all 和 any 操作符
- 多列子查询
指返回多个数据的子查询语句
基本语法:select ... from ... where (字段1, 字段2, ... ) = (select 字段1, 字段2, ... from ...);
- 表复制和去重
指自我复制数据,有时为了对某个 SQL 语句进行效率测试,需要海量数据时,可以用表复制的方法为表创建海量数据
基本语法:insert into 表1 (字段1, 字段2, ... ) select 字段1, 字段2, ... from 表2;
insert into 表1 select * from 表1;
思考题:如何删除一张表中的重复记录?(即如何去重)
- 合并查询
合并多个 select 语句的结果,可以使用集合操作符号 union,union all
1.union all :用于取得两个结果的并集,当使用该操作时,不会取消重复行
2.union :与 union all 的区别是,会自动去掉结果集中的重复行 - 外连接
1.左外连接(左侧的表完全显示)
基本语法:select ... from 表1 left jion 表2 on 条件; //表1 就是左表
2.右外连接
MySQL约束
约束用于确保数据库的数据满足特定的规则
在 mysql 中,约束包括:not null,unique,primary key,foreign key 和 check 5种
- primary key(主键)
1.基本使用:字段名 字段类型 primary key
2.用于唯一标识表行的的数据,当定义主键约束后,该列不能重复且不能为空
使用细节:
1.主键不能重复且不能为空
2.一张表中最多只能有一个主键,但可以是复合主键,primary(字段1, 字段2)
3.主键的指定方式有两种:① 直接在字段后指定;② 在表定义后写 primary key(列名)
4.desc 表名,可以看到 primary key 的情况
5.在实际开发中,每个表往往都会设计一个主键 - not null(非空)
基本使用:字段名 字段类型 not null - unique(唯一)
基本使用:字段名 字段类型 unique
使用细节:
1.如果没有指定 not null ,则 unique 字段可以有多个 null
2.如果一个列(字段)是 unique not null ,使用效果等价于 primary key
3.一张表可以有多个 unique 字段 - foreign key(外键)
用于定义主表和从表的关系:外键约束要定义在从表上,主表必须具有主键约束或 unique 约束,当定义外键约束后,要求外键列数据必须在主表的主键列存在
基本使用:foreign key (本表字段名) references 主表名(主键名或 unique 字段名)
使用细节:
1.外键指向的表的字段,必须要求是 primary key 或 unique 字段
2.表的类型是 innodb,才支持外键
3.外键字段的类型要和关联的主键字段的类型一致,长度可以不同
4.外键字段的值,必须在主键字段中出现过,或者为 null
5.一旦建立了主外键的关系,不能随意删除数据 - check
用于强制行数据必须满足的条件
oracle 和 SQL server 均支持 check,但是 mysql 5.7 版本目前不支持 check,只做语法校验,但不会生效
mysql 8.0 及以上版本可以支持 check
在 mysql 中实现 check 的功能,一般是在程序中控制,或通过触发器完成 - 自增长
介绍:在某站表中,存在一个 id 列(整数型),希望在添加记录时该列的值从 1 开始自动的增长
基本使用:字段名 整型 primary key auto_increment
使用细节:
1.一般来说,自增长是和 primary key 配合使用的
2.自增长也可以配合 unique 使用
3.自增长修饰的字段为整数型
4.自增长默认从 1 开始,也可以通过指令修改:alter table 表名 auto_increment = 新的开始值;
5.如果你添加数据时,给自增长字段(列)指定了值,则以指定的值为准,如果指定了自增长,一般来说,就按照自增长的规则来添加数据
MySQL索引(重点)
- 介绍
mysql 索引有 4 种类型:主键索引、唯一索引、普通索引、全文索引
索引的优点:提高数据库性能;大幅提高查询速度
缺点:索引本身也会占用内存空间,用空间换取时间
基本使用:create index 索引名称 on table(字段);
创建索引后,只对创建了索引的列有效 - 索引机制
1.为什么要创建索引?
当没有索引时,会进行全表扫描,查询速度很慢
2.使用索引为什么会快?
创建索引后会形成一个索引的数据结构——二叉树
3.思考:如果比较了 30次,覆盖表的范围是 2^30 次方
4.索引的代价:磁盘空间占用;对删除、修改、插入语句效率有影响;
5.在实际开发中,使用查询语句远远大于添加、修改、删除 - 创建索引
在实际开发中,普通索引(index)使用的最多,一般不使用 mysql 自带的全文索引,而是使用全文搜索(Solr)和 ElasticSearch(ES) - 索引使用
1.添加索引
添加普通索引有两种方式:create index 索引名称 on 表名(列);
alter table 表名 add index 索引名称 (列);
添加唯一索引:create unique index 索引名称 on 表名(列);
添加主键索引:alter table 表名 add primary key (主键列);
思考:如何选择添加唯一索引和主键索引?
如果某列的值是不会重复的,则优先考虑使用 unique 索引
2.删除索引
drop index 索引名称 on 表名;
删除主键索引:alter table 表名 drop primary key;
3.修改索引
方法:先删除索引,再添加新的索引
4.查询索引
show index from 表名;
show indexes from 表名;
show keys from 表名;
desc 表名;
- 创建索引规则
哪些列上适合使用索引?
1.较频繁的作为查询条件的字段应该创建索引
2.唯一性太差的字段不适合单独创建索引
3.更新非常频繁的字段不适合创建索引
4.不会出现在 where 子句中的字段不应该创建索引
MySQL事务
- 什么是事务
1.概念:事务是用于保证数据的一致性的,它由一组相关的 dml 语句组成,该组的 dml 语句要么全部成功,要么全部失败。如转账就要用事务来处理,用以保证双方金额的一致性
2.事务和锁:当执行事务操作时,mysql 会在表上加锁,防止其他用户修改表的数据 - mysql 数据库控制台事务的几个重要操作:
1.start transcation 开始一个事务
2.savepoint 设置保存点
3.rollback to 回退事务
4.rollback 回退全部事务,直接返回事务开始的状态
5.commit 提交事务,所有的操作生效,不能回退 - 事务操作
1.回退事务:保存点是事务中的点,用于取消部分事务。当结束事务时(commit),会自动的删除该事务所定义的所有保存点;当执行回退事务时,通过指定保存点可以回退到指定的地方
2.提交事务:使用 commit 语句提交事务,当执行 commit 语句后,会确认事务的变化,结束事务,删除保存点,释放锁,数据生效 - 事务注意事项:
1.如果没有开启事务,默认情况下,dml 操作是自动提交的,不能回滚
2.如果开启了一个事务,但没有设置保存点,若执行 rollback 默认回滚到事务开始的状态
3.可以在事务未提交前,根据实际需求设置多个保存点
4.可以在事务未提交前,执行 rollback to 选择回退到哪个保存点
5.innodb 存储引擎支持事务,但myisam 不支持
6.开始一个事务:start transcation;
或set autocommit=off;
- 隔离级别
1.多个连接开启各自事务操作数据库中的数据,数据库系统要负责隔离操作,以保证各个连接在获取数据时的准确性
2.如果不考虑隔离性,可能会引发如下问题:脏读、不可重复读、幻读现象
3.mysql 4种隔离级别:
脏读(dirty read) | 不可重复读(nonrepeated read) | 幻读(phantom read) | |
---|---|---|---|
读未提交(read uncommitted) | 有 | 有 | 有 |
读已提交(read committed) | 无 | 有 | 有 |
可重复读(repeatable read) | 无 | 无 | 无 |
可串行化(serializable) | 无 | 无 | 无 |
mysql 隔离级别定义了事务与事务之间的隔离程度
脏读(dirty read):当一个事务读取另一个事务尚未提交的修改,会产生脏读
不可重复读(nonrepeated read):同一查询在同一事务中多次进行,由于其它提交事务所做的修改或删除,每次返回不同的结果集,此时发生不可重复读
幻读(phantom read):同一查询在同一事务中多次进行,由于其它提交事务所做的插入操作,每次返回不同的结果集,此时发生幻读
- 查看隔离级别
mysql 5.7 版本:
1.查看当前会话隔离级别:select @@tx_isolation;
2.查看系统当前隔离级别:select @@global.tx_isolation;
3.设置当前会话隔离级别:set session transcation isolation level 要设置的级别;
4.设置系统当前隔离级别:set global transcation isolation level 要设置的级别;
mysql 8.0 版本:
查看隔离级别:select @@transcation_isolation;
注:mysql 默认的事务隔离级别是:repeatable read 可重复读 - 事务ACID
1.原子性(Atomicity)
指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
2.一致性(Consistency)
事务必须使数据库从一个一致性状态,变换到另外一个一致性状态
3.隔离性(Isolation)
多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事物的操作数据所干扰,多个并发事务之间要相互隔离
4.持久性(Durability)
指一个事务一旦被提交,它对数据库中的数据的改变就是永久性的
MySQL存储引擎
- 基本介绍
1.MySQL 的表类型由存储引擎决定,主要包括 myisam, innodb, memory
2.MySQL 数据库表支持 6 种存储类型:CSV, MEMORY, ARCHIVE, MRG_MYISAM, MYISAM, InnoDB
3.这 6 种又分为两类,一类是“事务安全型”,比如 innodb ,其余都属于第二类,称为“非事务安全型”,如 myisam 和 memory - 细节说明
1.Myisam 不支持事务,也不支持外键,但其访问速度块,对事务完整性没有要求
2.InnoDB 存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但相比 Myisam ,InnoDB 写的处理效率会差一些,并且会占用更多的磁盘空间以保留数据和索引
3.Memory 使用存放在内存中的内容创建表,每个 Memory 表对应一个磁盘文件,Memory 类型的表访问速度很快,因为它的数据是放在内存中的,并且默认使用哈希(hash)索引。但是一旦 MySQL 服务关闭或重启,表中的数据会丢失掉。表的结构还在 - 如何选择表的存储引擎
查看所有的存储引擎:show engines;
innodb:支持事务,支持外键,支持行级锁
myisam:添加速度快,不支持事务和外键,支持表级锁
memory:数据存储在内存中,执行速度很快(没有 io 读写),默认支持哈希索引
1.如果你的应用不需要事务,处理的只是基本的 CRUD 操作,则选择 MyISAM
2.如果需要支持索引,选择 InnoDB
3.Memory 存储引擎是将数据存储在内存中,由于没有磁盘 i/o 的等待,速度很快,但由于是内存存储引擎,所做的任何修改在 MySQL 服务器重启后都将消失
修改存储引擎:alter table 表名 engine=存储引擎;
MySQL视图
- 基本概念
1.视图是一个虚拟表,其内容由查询定义,跟真实的表一样,视图包含列,其数据来自对应的真实表(基表)
2.视图和真实表(基表)存在映射关系
3.通过视图可以修改基表的数据,反过来,基表的改变,也会影响到视图的数据 - 视图的基本使用
1.创建视图:create view 视图名 as select语句;
2.更新成新的视图:alter view 视图名 as select语句;
3.查看创建视图的指令:show create view 视图名;
4.删除视图:drop view 视图名;
- 使用细节
1.创建视图后,到数据库查看,对应视图只有一个视图结构文件(视图名.frm)
2.视图的数据变化会影响到基表,基表的数据变化也会影响到视图(增,删,改)
3.视图中可以再使用视图,数据仍然来自基表 - 视图最佳实践
1.安全
2.性能
3.灵活
MySQL管理
- mysql 用户
mysql 中的用户,都存储在系统数据 mysql 中的 user 表中
user 表的重要字段说明:
1.host:允许登录的位置,localhost 表示用户只允许本机登录
2.user:用户名
3.authentication_string:加密后的密码 - 创建新的用户
create user '用户名' @'ip地址' identified by '密码';
- 删除用户
drop user '用户名' @'ip地址';
- 登录
不同的数据库用户,登录到数据库管理系统(DBMS)后,根据相应的权限,可以操作的数据库和数据对象(表,视图,触发器)都不相同
- 用户修改密码
1.修改自己的密码:set password = password('密码');
2.修改其他人的密码,需要权限:
set password for '用户名' @'ip地址' = password('密码');
- 给用户授权
基本语法:grant 权限列表 on 库.对象名 to '用户名' @'ip地址' [ identified by '密码' ]
说明:
1.权限列表,多个权限用逗号分开
grant select on ...
grant select delete, create on ...
grangt all on ... //表示赋予该用户在该对象上的所有权限
2.库.*:表示某个数据库中的所有数据对象(表,视图等)
3.identified by 可以省略,也可以写出
如果用户存在,就是授权的同时修改该用户的密码
如果该用户不存在,就是授权的同时创建该用户
- 回收用户授权
基本语法:revoke 权限列表 on 库.对象名 from '用户名' @'登录位置';
- 权限生效指令
如果权限没有生效,可以执行下面的指令
基本语法:flush privilege;
- 使用细节
1.在创建用户时,如果不指定 host ,则为 % ,% 表示所有的 ip 都有连接权限
2.也可以指定某个 ip 段的用户有连接数据库权限
3.在删除用户时,如果 host ,如果 host 不是 %,需要明确指定'用户名' @'host 值'