MySQL
MySQL
墨菲定律主要包括四个方面:
-任何事都没有表面看起来那么简单;
-所有的事都会比你预计的时间长;
-会出错的事总会出错;
-如果你担心某种情况发生,那么它就更有可能发生。
初识MySQL
MySQL是目前最流行的开放源码的数据库管理系统,是完全网络化的跨平台的关系型数据库系统,它是一款自由软件。其主要目标是快捷、简便、易用,但是它的规模小、功能有限…
MySQL的优势
- 使用C/C++编写,源代码具有可移植性
- 支持多种操作系统
- 为多种编程语言提供了API
- 支持多线程,充分利用CPU
- 优化的SQL查询算法,有效地提高查询速度
- 提供TCP/IP、ODBC、JDBC等多种数据库链接途径
- 可以处理拥有上千万条记录的大型数据库
MySQL服务器启停(DOS窗口)
-
启动服务器:
- net start [服务名] eg: net start mysql
-
停止服务器:
- net stop [服务名] eg: net stop mysql
连接和断开MySQL服务器
- 连接:
- mysql [-h MySQL服务器所在地址] [-P 端口号] -u 用户名 -p密码
- -h 默认是127.0.0.1或者localhost
- -P 默认的端口号为3306 (若有更改,不可省略,必须有)
- mysql [-h MySQL服务器所在地址] [-P 端口号] -u 用户名 -p密码
- 断开:
- quit;
- 此操作是在mysql命令行中操作
- quit;
MySQL数据类型
- 数值类型
- 整数类型
- tinyint 占1个字节 表示范围:-128~127 (无符号:0~255)
- smallint 占2个字节 表示范围:-32768~32767
- mediumint 占3个字节 表示范围:-8388608~8388607
- int 占4个字节 表示范围:-2147483648~2147483647
- bigint 占8个字节
- 小数类型
- float 单精度 占4个字节
- double 双精度 占8个字节
- decimal[M,D] M表示长度,D表示小数点精确的位数 大小不确定
- M默认为10,最大为65,
- D默认为0,最大为30,表示小数点位数
- 整数类型
- 文本类型
- 字符
- char 表示范围:0~255个字符
- char(长度) 表示定长,会分配固定长度的字符空间
- char 表示范围:0~255个字符
- 字符串
- varchar 表示范围:0~65535个字节
- varchar(长度) 表示变长,将按照实际字符长短来分配空间
- 有效范围将少1~3个字节用于记录大小
- 如果表的编码是utf8 则长度最长为 21844字符
- 如果表的编码是gbk 则长度最长为32766字符
- text 表示范围:0~2^16-1
- longtext 表示范围:0~2^32-1
- varchar 表示范围:0~65535个字节
- 字符
- 二进制数据类型
- blob 表示范围:0~2^16-1
- longblob 表示范围:0~2^32-1
- 日期类型
- 常用
- date 存放 年-月-日
- time 存放 时:分:秒
- datetime 存放 YYYY-MM-DD HH:mm:ss
- year 存放 年
- timestamp 时间戳
- 若在该类型后加 not null default current_timestamp on update current_timestamp 便会在没有给定该字段值时,自动以当前时间进行更新
- 常用
数据库管理
创建数据库
create database [if not exists] 库名
[character 字符集] [collate 排序规则];
-
不允许同一系统中存在两个相同名称的数据库 if not exists 可以先判断后创建
-
常用排序规则:utf8_bin区分大小写; utf8_general_ci不区分大小写
-
若该数据库中的表不指定字符集和校对规则,将默认按照数据库的格式(即my.ini文件中default-character-set变量的值)
-
若创建数据库或表时,为了规避关键字,可以使用 ` 将其引起来
查看当前服务器中所有数据库
show databases;
- 将返回一个数据库名列表
查看前面创建的数据库的定义信息
show create database 库名;
- 将返回之前所创建该数据库时的完整语句,包含最低支持版本,且库名会被反引号(`)引起来
选择数据库
use 数据库名;
修改数据库
alter database [数据库名]
{[default] character set 字符集|[default] collate 校对规则}
- 在进行alter database时,用户必须具有对数据库进行修改的权限
删除数据库
drop database 库名;
- 须谨慎!一旦操作,该数据库的所有结构和数据都将删除,无法恢复,除非有备份
备份数据库
mysqldump -u 用户名 -p密码 -B 数据库名列表 >路径+文件名.sql
- 在命令窗口执行
恢复数据库
source 路径+需要恢复的备份文件名.sql
- 尽可能保证是纯英文路径、也可以直接扩展名为sql的文件直接复制粘贴到编辑器执行
创建表
create [temporary] table [if not exists] 表名
(字段名 类型[(长度) [check(约束条件)] [auto_increment]],…)
[character set 字符集] [collate 校对规则] [engine 存储引擎类型];
-
temporary 该关键字表示当前创建表为临时表
-
字段名列表参数说明:
-
表至少要有一列,即至少要有一个字段名
-
字段名 类型 (长度) [NOT NULL] [primary key] [check(约束条件)]
-
(长度) 根据字段类型决定属性,给定长度
-
check(约束条件) 约束条件为一个SQL表达式
- 在MySQL5.7中还不支持check,只做语法校验,但不会生效
-
auto_increment 为该字段设置自增,每加一条记录,该字段自动加1
-
只适用于整数序列,小数也可以但极少使用
-
一般来说自增长是和primary key或unique一起出现搭配使用
-
自增长的默认值是从1开始,也可以使用命令自行更改起始值:
alter table 表名 auto_increment = 新的起始值;
-
-
NOT NULL 指定某字段是否可以为空,默认为允许为空
-
primary key(字段名) 为某个字段指定一个主键
-
-
-
若不设定字符集和校对规则,将跟随所在数据库的设定
复制表结构
create table [if not exists] 表名 like 源数据表名;
或
create table [if not exists] 表名 as select语句;
-
将会把源数据表的表结构复制到新表中,但不会复制表数据
-
若想把源数据表的表数据也复制到新表中,可用as select 按照第二种语句,但该表不包括源数据表的主键等属性信息
-
create table [if not exists] 表名 like 源数据表名; insert into 表名 select * from 源数据表名;
修改表结构
alter [ignore] table 表名
add 字段名 类型(长度) [not null] [default] [first|after 已存在字段名], add 索引名 (字段名), add primary key (字段名),
modify 字段名 类型(长度) [not null] [default],
change 旧字段名 新字段名 类型(长度) [not null] [default],
alter 字段名 set default 值| drop default,
drop 已存在字段名, drop primary key, drop index 字段名,
character set|charset 字符集, collate 校对规则, engine 存储引擎类型;
rename 新表名;
-
alter table 语句允许指定多个动作,之间用逗号分隔
-
**add: **可以添加新字段,还可以指定是否为空、默认值等,且可以确定其位置添加在什么字段后; 为已存在字段增加索引; 为已存在字段设定主键
-
**modify: **可以更改已存在字段的类型、是否为空、默认值等
-
**change: **可以更改原字段名,且重新指定是否为空、默认值等;若新旧字段名相同,可以充当modify来使用,更改已有字段的类型、是否为空、默认值等
-
**alter: **可以为已存在字段设定默认值
-
**drop: **删除已存在的字段名;删除主键;删除某个字段的索引
-
重新为表定义新的字符集、校对规则、存储引擎类型
删除表
drop table [if exists] 表名;
- 若删除一个不存在的表将会报错,表名前+if exists 将不会出错
插入表记录
insert into 表名 [(字段名列表)] values (值列表) | select 结果集 ;
-
当字段名列表省去时,须向表中所有列插入数据,否则必须字段名列表与值列表一一对应(字段名可以不同)
-
字符和日期型的数据应该用单引号引起来
-
当字段允许为空时,可以直接插入null
-
当插入多条数据时,每条数据的值列表间用逗号(,)隔开
-
select 结果集,是将select语句得到的查询结果插入到与该表的结构完全一致的后边 点击跳转至模板
replace into 表名 [(字段名列表)] values (值列表) | select 结果集 ;
-
操作与insert into相似,但当插入数据因主键重复时,insert将会报错,replace会覆盖掉主键重复的原数据
修改表记录
update 表名 set 字段名1 = '新值' ,字段名2 = '新值',… [where 条件表达式];
- set 子句指出要修改的列和其对应的值,where子句为可选项,若没有给出,将对所有记录进行更新
删除表记录
delete from 表名 [where 条件表达式];
-
若不给出where子句,将删除所有的记录
- 删除所有记录亦可用 truncate table 表名;
-
delete语句和truncate table语句的区别:
- 使用truncate table语句后,表中的auto_increment计数器将重置
- 参与了索引和视图的表,应使用delete语句操作
- truncate table操作要比delete操作使用的系统和事务日志资源要少,delete语句每删除一行都会在事务日志中添加一行记录,而truncate table只在事务日志中记录页的释放
表记录的检索
select [distinct] *|字段列表 from 表名
[where 条件表达式] [group by 分组字段] [having 二次条件字段]
[order by 排序字段 [asc|desc]] [limit m,n];
- distinct 为可选项,指显示结果时,将去掉查出来的完全重复的数据
- *表示所有列,给定字段名列表可以只显示特定列;其中字段名列表可以是简单运算,可以指定别名: 字段名简单表达式 as 别名
- where子句常用运算符
- 比较运算符
- < > <= >= = <> 或 !=
- <> 或 != 均表示不等于
- between…and…
- 字段名 between 下限 and 上限 范围:[下限,上限]
- [not] in( 值列表|select语句 )
- 可以直接给定值,亦可按select结果集
- 加not则刚好相反
- [not] like '值' 或 not like '值'
- 模糊比较:字段名 like '值';可以使用占位符 (_)表示一个字符 (%)表示0或多个字符
- 加not则刚好相反
- is [not] null
- < > <= >= = <> 或 !=
- 逻辑运算符
- and 多个条件并列成立
- or 多个条件任一成立
- not 条件不成立
- 比较运算符
- order by 字段名 asc|desc
- 默认按照升序asc排序
- 如果对含有null值得列进行排序,升序将把null放在最前面,降序将把null放在最后边
- group by 字段名 [having 条件表达式]
- 对记录进行分组查询,查询结果只显示每组的一条记录
- 所查询的列必须包含在分组的列中,以保证数据没有矛盾
- 当group by 后有多个字段时,将按照字段顺序 依次进行分组
- 若想要对分组后的结果再次进行条件筛选,选用having 表达式,进行二次条件筛选
- limit [m,]n 限制查询结果的数量
- m 表示起始行,n 表示显示的行数,当m省去时,将从第一行开始显示n行
- 第一条记录的行号是0
聚合函数
count(*|字段名 )
- 当参数为*时,将返回选择集合中的所有行的数目(包括null值)
- 当参数为字段名时,将返回该列非null值得行数目,null不参与统计
sum( )
- 可以求出表中某个数值类型字段或字段简单运算得总和
avg( )
- 可以求出表中某个数值类型字段或字段简单运算得平均值
max( )
- 可以求出表中某个某个数值类型字段取值得最大值
min( )
- 可以求出表中某个某个数值类型字段取值得最小值
字符串相关函数
charset( str ) 返回字串的字符集
concat( str1,[str…]) 连接各字符串,各字符串间( , )隔开
inster(字符串1,字符串2) 返回字符串2再字符串1中第一次出现的位置
ucase( str ) 转换成大写
lcase( str ) 转换成小写
left( str, n ) 从字串的左边截出n个字符
right( str, n ) 从字串的右边截出n个字符
substring( str,m,[n] ) 从字串的第m个位置开始取出n个字符,当n省去,便从第m个位置开始截取到最后
length( str ) 返回字串的长度
replace( 字段名, 旧串, 新串) 将某字段的旧串找出替换成新串
strcmp( 字符串1,字符串2 ) 逐字符比较两字串的大小(字串1小于字串2返回-1;字串1大于字串2返回1;两字串相等返回0)
ltrim( str ) 将字串左侧的空格去掉并返回
rtrim( str ) 将字串右侧的空格去掉并返回
trim( str ) 将字串两侧的空格都去掉并返回
数学相关函数
abs( num ) 返回绝对值
bin( num ) 将十进制转二进制返回
ceiling( num ) 向上取整,返回一个比num大的最小整数
floor( num ) 向下取整,返回一个比num小的最大整数
conv( num,进制A,进制B ) 把num当作A进制数,并转换成B进制数返回
format( num, 位数 ) 四舍五入保留小数位数
least( num1,num2,num… ) 返回列表中最小的值
mod( num1,num2 ) 取余,返回num1%num2的值
rand( seed ) 返回随机数,每次返回不同的随机数,若使用种子,则随机数不变 范围:[0,1]
时间日期相关函数
current_date( ) 返回当前日期
current_time( ) 返回当前时间
current_timestamp( ) 返回当前时间戳
now( ) 返回当前时间(包含日期 时间)
date( 日期时间 ) 返回参数中的日期部分
last_day( 日期 ) 返回参数中的月份中的最后一天的日期
date_add( 日期时间, interval n 单位 ) 返回参数中的日期时间加上单位个n的日期时间 eg: date_add(now(), interval 10 hour) 返回当前时间加上十个小时的日期时间
date_sub( 日期时间, interval n 单位 ) 返回参数中的日期时间减去单位个n的日期时间 eg: date_sub(now(), interval 45 minute) 返回当前时间减去45分钟的日期时间
datediff(日期1,日期2) 返回两个日期所差的天数(日期1-日期2)
timediff(日期1,日期2) 返回两个日期所差的时间(返回时分秒)
year|month|day (datetime) 返回参数中的年|月|日
unix_timestamp( ) 返回1970年1月1日到现在的秒数,等同于Java中的System.currentTimeMillis( )
from_unixtime(时间戳秒数, '%Y-%m-%d %H:%i:%s'|'%Y-%m-%d') 将时间戳按照格式转换,该格式是已定义好的
加密函数和系统函数
user( ) 查询当前登录mysql的用户及ip地址
database( ) 查询当前使用的数据库名称
md5( str ) 为字串算出一个MD5 32的字符串,(用户密码)加密
password( str ) 从原文密码str计算并返回密码字符串,通常用于对mysql数据库的用户密码加密
流程控制函数
if(表达式, 值1, 值2) 如果表达式的值位true,则返回值1,否则返回值2
ifnull(expr1, expr2) 如果expr1非null,则返回expr1,否则返回expr2
select case when expr1 then expr2 when expr3 then expr4 else expr5 end 如果expr1为true,则返回expr2,如果expr3为true,则返回expr4,否则返回expr5.类似于多重分支结构
连接查询
-
合并查询
select 字段列表 from 表名 union|union all select 字段列表 from 表名;
-
union all 用于取得两个结果集的并集。使用该操作符时,不会取消重复行
-
union 会将结果合并同时去重
-
-
外连接
- 左外连接 将左侧的表完全显示,与右侧不匹配的也会显示
- 右外连接 将右侧的表完全显示,与左侧不匹配的数据也会显示
- 匹配不到的数据会自动填补NULL
select 字段列表 from 表名1 left|right join 表名2 on 表名1.字段名 = 表名2.字段名
MySQL约束
约束用于确保数据库的数据满足特定的商业规则
-
主键 primary key
- 主键不能重复而且不能为NULL
- 一张表最多只能有一个主键,但可以有复合主键
- 复合主键:在所有字段名后用primary key(字段列表)指定的主键为复合主键
- 拥有主键的列不允许有重复值
- 复合主键其中一个字段有相同值不会有影响,只有当复合主键中的字段同时满足时,才会违反主键规则
- 主键的两种指定方式:
- 建表时,在字段名后跟 primary key
- 建表时,在字段列表最后,逗号隔开跟 primary key(字段名…)
- 使用desc 表名可查看表结构,看到primary key的情况
-
非空 not null
- 当某字段指定了not null 非空时,那么插入数据时,必须为该列提供数据
-
唯一索引 unique
- 当某字段定义了唯一索引后,该字段的值不能重复,但可以为NULL
- 可以为多个字段指定唯一 unique
-
外键 foreign key
用于定义主表和从表之间的关系
-
外键约束要定义在从表上,主表则必须具有主键约束或是unique约束 即外键指向的表的字段,要求必须是primary key或者unique
-
创建外键的表的存储引擎类型必须为innodb
-
外键字段的类型要和主键的字段类型一致 (长度可以不同)
-
外键列数据必须在主表的主键列存在或是为NULL (前提是外键字段允许为NULL)
-
-
条件 check
用于强制行数据必须满足的条件
- 用法: 建表时,字段名 类型(长度) check(条件)
- 在MySQL5.7中还不支持check,只做语法校验,但不会生效
MySQL索引
索引是一种将数据库中单列或者多列的值进行排序的结构。创建索引的目的是为了优化数据库的查询速度。不同的存储引擎定义每个表的最大索引数和最大索引长度不同。索引有两种存储类型:B型树 和哈希索引 。其中,B型树是系统默认索引方法。
索引分类
-
普通索引
不应用任何限制条件的索引,可以在任何数据类型中创建
-
唯一索引 UNIQUE
创建该索引,须保证索引的值唯一,主键是一种特殊的唯一索引
-
全文索引 FULLTEXT
该索引只能创建在char、varchar或者text类型的字段上,默认情况下,对大小写不敏感;一般开发,不适用MySQL自带的全文索引,而是使用全文搜索框架Solr和ElasticSearch( ES )
创建索引
-
建表时创建:
create table 表名(字段名 类型(长度) [unique|primary key],字段名…类型); 或 create table 表名(字段名列表, index|unique index|fulltext key|primary key(索引字段));
-
在已存在表中创建:
create [unique|fulltext] index 索引名 on 表名(索引字段); 注:普通索引直接index 索引名
-
修改表结构时创建:
alter table 表名 add [unique|fulltext] index 索引名(索引字段); 注:普通索引直接index 索引名(索引字段)
查询表是否有索引
show index[es] from 表名;
或
show keys from 表名;
删除索引
drop index 索引名 on 表名;
注意事项
- 创建索引后,只有索引字段对应的列的查询速度会提高,其它普通字段的查询速度不变
- 索引的原理是二叉树结构进行查询,中值依次做节点,查找时进行左右子叶快速定位,比较n次,可查找的的覆盖范围为:2^n
- 创建索引后,表的磁盘占用会变大,会在底层形成一个二叉树索引占一定的磁盘空间
- 索引会对dml(增删改)语句有一定的影响,当对表进行操作后,就需要对表的索引进行维护,对速度有影响,可先删除索引再进行dml操作
- 如果某列的值是不重复的,则优先考虑使用unique索引
- 较频繁的作为查询条件字段应该创建索引;唯一性差的字段不适合创建索引;更新非常频繁的字段不适合创建索引;不会出现在where子句中字段不应该创建缩影
MySQL事务
事务用于保证数据的一致性,它由一组相关dml语句组成,该组的dml语句要么全部成功,要么全部失败。当执行事务操作(dml语句)时,MySQL会在表上加锁,防止其它用户改表的数据。
数据库控制台事务的基本操作
- start transaction或set autocommit = off 开始一个事务
- savepoint 保存点名 设置一个保存点
- rollback to 保存点名 回退事务
- rollback 回退全部事务
- commit 提交事务,所有的操作生效,不能回退
注意事项
- 事务机制适用于存储引擎为InnoDB,其它不好使
- 若回退的保存点之间还有其它保存点,在回退之后将失效无法到达之间的保存点
- 当结束事务时,会自动删除所定义的所有保存点
- 使用了commit语句后,将会确认事务的变化、结束事务、删除保存点、释放锁,数据生效
- 如果只是开始了一个事务,但是没有创建保存点,那么可以执行rollback,会回退到事务开始的状态
MySQL事务隔离级别
多个连接开启各自事务操作数据库中数据时,数据库系统要负责隔离操作,以保证各个连接在获取数据时的准确性。
-
事务隔离级别
脏读(dirty read): 当一个事务读取另一个事务尚未提交的修改时,产生脏读
不可重复读(nonrepeatable read): 同一查询在同一事务中多次进行,由于他提交事务所做的修改或删除,每次返回不同的结果集,此事发生不可重复读
幻读(phantom read): 同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻读。
MySQL隔离级别定义了事务与事务之间的隔离程度
MySQL隔离级别(四种) 脏读 不可重复 幻读 加锁读 读未提交(Read Uncommitted) √ √ √ 不加锁 读已提交(Read Committed) × √ √ 不加锁 可重复读(Repeatable Read) * 默认 × × × 不加锁 串行化(serializable) × × × 加锁 -
查看当前MySQL会话的隔离级别
select @@tx_isolation;
-
查看系统当前隔离级别
select @@global.tx_isolation;
-
设置事务的当前会话隔离级别
set session transaction isolation level 具体级别;
-
设置系统当前隔离级别
set global transaction isolation level 具体级别;
-
-
事务的ACID特性
- 原子性(Atomicity): 指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
- 一致性(Consistency): 事务必须使数据库从一个一致性状态变换到另外一个一致性状态
- 隔离性(Isolation): 事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要 相互隔离
- 持久性(Durability): 一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即时数据库发生故障也不应该对其有任何影响
MySQL表类型和存储引擎
MySQL的表类型由存储引擎(Storage Engines)决定
MySQL数据表主要支持六种类型,分别是:CSV、Memory、ARCHIVE、MRG_MYISAM、MYSIM、InnoDB
InnoDB属于事务安全型 ,其它属于非事务安全型 。
常用引擎:
- MyISAM不支持事务、也不支持外键,但其访问速度快,对事务完整性没有要求
- 添加速度快;不支持外键和事务;支持表级锁
- InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是比起MyISAM存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引
- 支持事务;支持外键;支持行级锁
- MEMORY存储引擎使用存在内存中的内容来创建表。每个MEMORY表只实际对应一个磁盘文件。MEMORY类型的表访问非常的快,因为他的数据是放在内存中的,并且默认使用HASH索引。但是一旦服务关闭,表中的数据就会丢失掉,表的结构还在。
- 数据存储在内存中[关闭mysql服务,数据丢失,但表结构还在];执行速度很快(没有IO读写);默认支持索引(hash表)
-
查看所有存储引擎
show engines;
-
如何选择表的搜索引擎
- 如果应用是不需要事务,处理的只是基本的CRUD(增删改查)操作,那么MyISAM是不二选择,速度快!
- 如果需要支持事务,选择InnoDB
- MEMORY存储引擎就是将数据存储在内存中,由于没有磁盘I/O等待,速度极快。但由于是内存存储引擎,所做的任何修改在服务器重启后都将消失(经典用法:用户的在线状态)
-
修改存储引擎
alter table 表名 engine 存储引擎
视图
视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含列,其数据来自对应的真实表(基表)。通过视图可以修改基表的数据,基表的改变,也会影响到使徒的数据
-
查询创建视图的权限
select Select_priv,Create_view_priv from mysql.user where user = '用户名';
-
创建视图
create view 视图名 [(字段列表)] as select 语句;
-
修改视图
alter view 视图名 as select 语句;
-
查看创建视图的指令
show create view 视图名;
-
删除视图
drop view 视图名;
-
视图特点
安全: 一些数据表有着重要的信息。有些字段是保密的,不能让用户直接看到 。通过视图只保留一部分字段,达到只让用户看不到保密的字段的目的
性能: 关系数据库的数据常常会份表存储,使用外键建立这些表的之间关系。通过视图可以将相关的表和字段组合在一起,就可以避免使用 join 查询数据
灵活: 如果系统中有一张旧的表,这张表由于设计的问题,即将被废弃。但很多应用都是基于这张表,不易修改。通过视图,将数据映射到新建的表。便可以做很少的改动达到升级数据表的目的
-
注意事项
创建视图前,应确保用户具有创建视图(create view)的权限
创建视图后,数据库中,对应视图只有一个视图结构文件(视图名.frm)
视图的数据变化会影响到基表,基表的数据变化也会影响到视图(insert update delete)
视图中可以再使用视图,数据仍然来自基表
MySQL管理
-
创建用户,并指定密码
create user '用户名'@'允许登录位置' identified by 密码
- 存储在mysql.user表中的密码是被password加密过的
- 若创建用户时,不指定Host (即允许登录位置),则默认为%, %表示所有IP都有连接权限;也可以直接指定IP地址段 (eg:192.168.%.%,表示192.168..这一IP段的都可以访问登录)
-
删除用户
drop user '用户名'@'允许登录位置';
- 如果Host不是%,则删除时需要明确指出允许登录位置
-
修改密码
修改自己的密码
set password = password('新密码');
修改他人的密码 (需要有修改用户密码的权限)
set password for '用户名'@'登录位置' = password('新密码');
-
给用户授权
grant 权限列表 on *.*|库.对象名 to '用户名'@'登录位置' [identified by 密码];
-
权限列表,多个权限间用逗号隔开;若是授予其全部权限,则选择关键词 all
-
*. 代表本系统中的所有数据库的所有对象(表、视图、存储过程)
库.* 代表某个数据库中的所有数据对象
-
identified by 可以省略
如果用户存在,就是修改用户的密码;如果该用户不存在,就是创建该用户
-
-
回收用户权限
revoke 权限列表 on 库.对象名 from '用户名'@'登录位置';
权限生效指令 (一般5.7以上的版本不需要刷新权限)
flush privileges;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!