回顾总结20

单表查询

details

DISTINCT

数据去重

AS语句

SELECT column_name AS 别名 from 表名

统计所有学生总分
SELECT name,(chinese + english + math) FROM student
使用别名表示学生总分
SELECT name,(chinese + english + math) AS total_score 
		FROM student

查询列

SELETE * || {column1 || expression,colunb2 ...} FROM table_name

时间比较

日期类型是可以直接比较,但是需要注意格式。比如1970-1-1,要写成1970-01-01

模糊查询LIKE子句

%:表示0~多个任意字符

_:表示单个任意字符

IS NULL

判断字符串是否为null,需要使用IS,而不是=

表结构DESC

DESC 表名

ORDER BY

SELECT column1,column2... FROM 表名 ORDER BY column asc/desc
asc(ascending):升序,默认
desc(descending):降序

示例:先按照部门号升序,并且按照雇员的工资降序排列
SELECT * FROM emp ORDER BY deptno ASC , sal DESC

GROUP BY

SELECT COUNT(*) , AVG(column1),column2 FROM 表名 GROUP BY column2 HAVING ...

having后接条件语句
查询通过将column2相同属性,合并,列的和count(*),和column1的平均值。使用ORDER BY,只能有一条未被处理过的列column2

分页查询

SELECT ... LIMIT START , ROWS
表示从start+1行开始取,取出rows行

子句顺序总结

如果一条select语句,同时包含有group by,having,limit,order by,那么它们的顺序是,group by,having,order by,limit

SELECT AVG(column1),COUNT(column2),column3...FROM table 
		GROUP BY column3
		HAVING AVG(column1) > 1000
		ORDER BY COUNT(column2) DESC
		LIMIT start,rows;

函数

统计函数

  1. 统计函数count

SELECT count()|| count(列名) FROM table_name
count(
):统计满足条件的记录的行数
count(列):统计满足条件列的记录的数量,会排除null值

  1. 合计函数sum

仅对数值有用
SELECT sum(column1),sum(column2)... FROM table_name

  1. 平均函数avg

SELECT avg(column1),avg(column2)... FROM table_name

  1. 函数Max/Min

SELECT max(column1)... FROM table_name

字符串函数

  1. 字符集CHARSET(str)

SELECT CHARSET(column) FROM table_name
会将column的字符编码显示出来

  1. 字符串拼接CONCAT

SELECT CONCAT(column1,'str',column2) FROM table_name
会将column1 + str +column2 拼接成一个字符串显示出来

  1. 查询子串INSTR

SELECT INSTR('happy study java','study') FROM DUAL
会查询并返回'happy study java'中 'study'的位置
DUAL:亚元表,系统表,可以作为测试表使用

  1. 字符串大写UCASE

SELECT UCASE(column) FROM table_name
会将column列的值,转换成大写字符串

  1. 字符串小写LCASE

SELECT LCASE(column) FROM table_name
会将column列的值,转换成小写字符串

  1. 字符串快速截取LEFT、RIGHT

SELECT LEFT(column,2) FROM table_name
会将column的值从左边取2个显示

SELECT RIGHT(column,2) FROM table_name
会将column的值从右边取2个显示

  1. 字符串长度LENGTH[字节]

SELECT LENGTH(column) FROM table_name
会将column的值按字节返回长度

  1. 替换REPLACE

SELECT REPLACE (column,'MANAGER','经理') FROM table_name
会将column列下的所有'MANAGER'替换成'经理'

  1. 比较STRCMP

SELECT STRCMP(column1,column2) FROM table_name
会逐字符比较字符串column1和column2的大小,返回-1,0,1

  1. 截取SUBSTRING

SELECT SUBSTRING (column,1,3) FROM table_name
从column列第一个开始取,取三个字符显示出来。这里字符不从0开始哦。

如果第三个参数不写,就是从第二个参数位置选取后面所有字符

  1. 去空格LTRIM、RTRIM、TRIM

SELECT LTRIM('column') FROM table_name
去除column列左边的空格。RLTRM和TRIM同

数学函数

  1. 绝对值ABS

SELECT ABS(column) FROM table_name
返回column的绝对值

  1. 二进制转换BIN

SELECT BIN(column) FROM table_name
返回column的二进制形式

  1. 向上取整CEILING

SELECT CEILING(column) FROM table_name
返回column向上取整的最小整数

  1. 进制转换CONV

SELECT CONV(column,10,8) FROM table_name
将column的值从10进制转换成8进制

  1. 向下取整FLOOR

SELECT FLOOR(column) FROM table_name
返回column向下取整的最大整数

  1. 保留精度FORMAT

SELECT FORMAT(column,3) FROM table_name
将column保留3位小数(四舍五入)
该函数会将值转换成字符串,如果再跟其他值进行比较,会无结果,字符串和数字不能进行比较

  1. 转16进制HEX

SELECT HEX(column) FROM table_name
将column转换成16进制

  1. 求最小值LEAST

SELECT LEAST(column1,column2,column3,column4) FROM table_name
返回这些列中的最小值

  1. 求余MOD

SELECT MOD(column,3) FROM table_name
返回column % 3的值

  1. 随机数RAND(send)

SELECT RAND() FROM DUAL
返回一个随机数在0-1之间的数,如果给定一个种子send,会返回对应固定的一个随机数

日期函数

  1. CURRENT_DATE():当前日期
  2. CURRENT_TIME():当前时间
  3. CURRENT_TIMESTAMP():当前时间戳

INSERT INTO table_name VALUES(CURRENT_DATE());

  1. DATE(datetime):将日期时间,保留日期

SELECT id,content,DATE(send_time) FROM mes
将send_time日期时间的格式转换成了日期格式

  1. DATE_ADD():时间相加/DATE_SUB:时间相减

SELECT * FROM mes WHERE DATE_ADD(send_time,INTERVAL 10 MINUTE) >= NOW()
查询表中十分钟内的数据。即send_time + 10分钟 >= 当前时间
DATE_ADD将send_time和interval 10 minute加起来,算出来send_time十分钟后的时间,和当前时间比较

INTERVAL后面的单位可以是year、minute、second、day等

  1. DATEDIFF()时间差(单位天)

SELECT DATEDIFF('2011-11-11','1990-01-01') FROM DUAL
得出column1 - column2 的时间差(天),该值可以取负数

  1. TIMEDIFF()时间差(单位多少小时多少分钟多少秒)其他同上
  2. NOW():当前时间,年月日时分秒
  3. YERA|MONTH|DAY(datetime):取出datetime中的年或月或日
  4. UNIX_TIMESTAMP():返回的是1970-1-1到现在的秒数
  5. FROM_UNIXTIME(UNIX_TIMESTAMP() ,'%Y-%m-%d %H-%i-%s'):会将一个毫秒数,如UNIX_TIMESTAMP,转换成想要的格式

实际开发中,也会使用int保存一个nuix时间戳,然后使用from_unixtime进行转换

加密函数和系统函数

  1. USER():查看登录到mysql的有哪些用户,以及登录的IP

SELECT USER() FROM DUAL

  1. DATEBASE():查询当前使用数据库名称

SELECT DATEBASE FROM DUAL
后面的FROM DUAL都可以省略

  1. MD5(str):为字符串str算出一个通过MD5加密的16进制32位的字符串,存储在数据库中

SELECT MD5(column) FROM DUAL

  1. PASSWORD(str):加密函数

SELECT PASSWORD(column) FROM DUAL

流程控制函数

  1. IF(expr1,expr2,expr3):如果expr1为真,返回expr2,否则返回expr3
  2. IFNULL(expr1,expr2):如果expr1不为null,返回expr1,否则返回expr2
  3. SELECT CASE WHEN expr1 THEN expr2
    WHEN expr3 THEN expr4
    ELSE expr5 END:多重分支,如果expr1为真,返回expr2,如果expr3为真返回expr4,否则返回expr5

多表查询

多表查询是指基于两个和两个以上的表查询,在实际的应用中,查询单个表可能不能满足你的需求

SELECT * FROM emp , dept

多表查询

默认情况下,当两个表查询时

  1. 从第一张表中,取出一行,和第二张表的每一行进行组合,返回结果是【含有两张表的所有列】
  2. 一共返回的记录数,是第一张表的行数*第二张表的行数
  3. 这样多表查询默认处理返回的结果,称为笛卡尔集
  4. 解决这个多表的关键就是要写出正确的过滤条件where
  5. 将两个表中有关联(相同的列)连接起来,不同的过滤掉

多表查询时的条件不能少于表的个数 - 1,因为每连接一个表,就需要一个条件,否则会出现笛卡尔集

自连接

把同一张表当做两张表使用

将原表复制一份,与自己连接查询。变成了另一种多表查询

此时需要给表取别名,然后使用表别名调用列名

例:SELECT worker.ename,boss.ename
FROM emp worker , emp boss
WHERE worker.mgr = boss.empno;

子查询

查询跟SMITH相同部门的员工,首先我们要知道部门编号

  1. 单行子查询(嵌套查询)

    SELECT deptno FROM emp WHERE ename = 'SMITH'

    查询出来ename名为SMITH的部门编号deptno的值

    然后根据编号,查询表

    SELECT * FROM emp WHERE deptno = (
    SELECT deptno FROM emp WHERE ename = 'SMITH' )

  2. 多行子查询

    此时不能使用单行子查询的 = 符号了,需要使用IN(),将查询出来的多行语句,放入IN中,等待匹配

临时表查询

可以根据查询条件,返回一个表。将该表,和原表进行多表查询

例:得到各个类中,价格最高的商品
先通过GROUP BY将相同类的物品整合起来,返回一个max价格的表当做临时表

表一,将一些需要的字段选择出来,方面观察数据
SELECT goods_id,cat_id,goods_name,shop_price FROM ecs_goods
表二,物品种类和该类价格最大值的物品选出来(这里用到了GROUP BY语句)
SELECT MAX(shop_price),cat_id FROM ecs_goods GROUP BY cat_id
多表查询,将上述两表合并,然后过滤掉不需要的表项。保留物品价格最大值一样且物品种类相同的数据
SELECT goods_id,temp.cat_id,goods_name,shop_price 
	FROM ecs_goods,(
	SELECT MAX(shop_price)AS max_price,cat_id FROM ecs_goods GROUP BY cat_id)AS temp
	WHERE ecs_goods.shop_price = temp.max_price AND temp.cat_id = ecs_goods.cat_id
	

all子句使用

SELECT ename , sal , deptno FROM emp WHERE sal > ALL(
SELECT sal FROM emp WHERE deptno = 30)

查询所有薪水,大于部门编号为30的所有人,的工资条件的人

效果等同于
SELECT ename , sal , deptno FROM emp WHERE sal > (
SELECT MAX(sal) FROM emp WHERE deptno = 30)

any子句使用

同上,all是大于所有人 = 大于最大的那个人。any是大于任意一个人 = 大于最小的那个人

多列子查询

SELECT deptno,job FROM emp WHERE ename = 'SMITH';
查询部门编号和工作,名字叫SMITH的人

将上述两列一行的表,当做子查询使用

SELECT * FROM emp WHERE (deptno,job)= (
SELECT deptno,job FROM emp WHERE ename = 'SMITH')
查询部门编号和工作 和给定部门编号和工作相等的数据。相当于原来的正常的一列查询,变成了两列,但是我们还需要多一步获取匹配的两列的数据查询。

表的复制

数据复制

INSERT INTO my_table (id,ename,sal,job,deptno)
SELECT empno,ename,sal,job,deptno FROM emp
将emp表的字段,复制到my_table的各字段上。

自我复制

INSERT INTO my_table SELECT * FROM my_table
每次都将自己表中的数据翻一倍,可以快速的增加数据。当我们需要海量数据测试某个sql语句的效率时

结构复制

CREATE TABLE my_table LIKE emp
将emp的所有字段结构,赋给一个新表

清除表的重复信息

通过distinct语句,借助一个新表。

  1. 创建一个新表,和原表的结构一样,使用LIKE语句创建
  2. 将原表的数据转移到新表,加上DISTINCT语句去重
  3. 改新表表名,删旧表。或者再转移一次数据,删新表

表的并集

UNION 和 UNION ALL

UNION ALL 会将所有数据并集在一起,并且不会去重,如果有两条一样的数据,会都存在

UNION 会将所有数据并集在一起,但是会去重,不会有重复的数据

左外连接和右外连接

SELECT ... FROM 左表 LEFT JOIN 右表 ON 条件

显示所有左表信息或者右表信息。没有关联的列显示为空

表的属性

主键 Primary key

  1. primary key不能重复而且不能为null

  2. 一张表最多只能有一个主键,但可以是复合主键

  3. 主键的指定方式,有两种

    直接在字段名后指定:字段名 primary key

    在表定义最后写 primary key(列名);

  4. 使用desc 表名,可以看到primary key的情况

  5. 每个表往往都会设计一个主键

约束

  • not null(非空)

    如果在列上定义了not null,那么当插入数据时,必须为列提供数据
    字段名,字段类型 not null

  • unique(唯一)

    当定义了唯一约束后,该列值是不能重复的

    字段名 字段类型 unique 或者 unique(字段名)

    小细节:如果没有指定not null ,那么 unique字段可以有多个null,并且一个表可以有多个unique字段

  • check(检查)

    mysql5.7版本不支持。在mysql8.0.16版本之后支持,oracle,sql server数据库都支持此约束

  • enum(枚举)

    可以指定一些数据给字段,让字段必须填写该数据之一,否则失败

  • auto_increment(自增长)

    自增长是和primary key 配合使用的

    自增长也可以单独使用,但是需要配合一个unique

    自增长修饰的字段为整数型(小数也可以,但是非常少见)

    自增长默认从1开始,也可以通过如下命令修改
    alter table 表名 auto_increment = xxx;

    如果添加数据时,给自增长字段指定了具体值,则以指定值为准

外键

语法:foreign key (column1) references table_name(column2)

假定有两张表,一张大哥表,里面有大哥名,和大哥工资,大哥名是主键。一张小弟表,里面有小弟名,和小弟的工资,还有大哥名,小弟名是主键。

从表是小弟表,大哥名设为外键,这个大哥名引用至主表里的大哥名,主表是大哥表,主表可以增加大哥名的数据,但是不能删除大哥名的数据,会导致从表数据缺失。想当于是从表引用了主表的数据
从表不能增加主表大哥名没有的数据,可以删除数据

反正就是一种联系,关联起来了。从表外键的数据可以不唯一,主表必须唯一,方便来说大部分是主表的主键。引用了主表的数据,当主表数据删除时,会顺着外键(线)查到从表是否有引用的关系,如果有引用的关系,需要把该主表的关系删除才能删除从表的数据。

相当于,父类和子类,子类是依托于父类的,如果要删除父类,需要把继承该父类的子类都删除。

details

  1. 外键指向的表的字段,要求是primary key或者是unique
  2. 表的类型是innodb,这样的表才支持外键
  3. 外键字段的类型要和主键字段的类型一致(长度可以不同)
  4. 外键字段的值,必须在主键字段中出现过,或者为null【前提是外键字段允许为nill】
  5. 一旦建立主外键关系,数据就不能随意删除了
  6. 外键是从表的字段,指向主表。

索引

提高数据库性能,不用加内存,不用改程序,不用调sql,查询速度可以提高百倍千倍

CREATE INDEX empno_index ON emp(empno)

索引也是数据,会增加存储空间。且,每个索引只对应一列,其他没有索引的效果没有任何改变。

索引的代价

  1. 磁盘的占用
  2. 对表进行dml(修改、删除、添加)操作的效率有影响

索引类型

  1. 主键索引,主键自动的为主索引(primary key)
  2. 唯一索引(unique)
  3. 普通索引(index)
  4. 全文索引(fulltext)【适用于MyISAM】

开发中一般不使用mysql自带的全文索引,而是考虑使用Solr和ElasticSearch(ES)

索引操作

  1. 显示索引
    SHOW INDEX FROM table_name

    SHOW INDEXES FROM table_name

    SHOW KEYS FROM table_name

  2. 添加索引

    • 主键索引:如果将字段设为主键,则自带有主键索引。

    • 唯一索引:CREATE UNIQUE INDEX 索引名 ON 表名(字段)

    • 普通索引,方式一:CREATE INDEX 索引名 ON 表名(字段)

      方式二:ALTER TABLE 表名 ADD INDEX 索引名 (字段)

      如果某字段的值,不会重复的话,优先考虑使用unique索引,否则使用普通索引

  3. 删除索引
    DROP INDEX 索引名 FROM 表名

    • 删除主键索引
      ALTER TABLE 表名 DROP PRIMARY KEY

总结

那些字段上适合使用索引

  1. 较为频繁的作为查询条件字段应该创建索引
  2. 唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件
  3. 更新非常频繁的字段不适合创建索引
  4. 不会出现在where子句中字段不该创建索引

事务

用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml语句要么全部成功,要么全部失败,如:转账就要用事务来处理,用以保证数据的一致性

这个事务,最好在表中开启,事务管理的是dml语句,创建表是ddl语句,先开启事务,后开启表,他是管理不到ddl语句的,并且,创建表后,每个dml语句执行时,会开启autotransaction,自动提交,创建表之前创建的事务会被顶替

事务和锁

当执行事务操作时(dml语句),mysql会在表上加锁,防止其他用户改表的数据,这对用户来讲是非常重要的。

mysql数据库控制台事务的几个操作

  1. start transaction:开始一个事务
  2. savepoint 保存点 名:设置保存点
  3. rollback to 保存点 名:回退事务
  4. rollback:回退全部事务
  5. commit:提交事务,所有的操作生效,不能回退

保存点savepoint

是事务所定义的一个在sql语句的位置,用于取消部分事务。

回退事务rollback

当结束事务时,会自动的删除该事务所定义的所有保存点。执行回退事务时(commit),通过制定保存点可以回退到指定的位置

提交事务commit

使用commit语句可以提交事务,当执行了commit语句子句后,会确认事务的变化,结束事务,删除保存点,释放锁,数据生效。当使用commit语句结束事务后,其它会话将可以查看到事务变化后的新数据(正式生效,相当于上传服务器)

details

  1. 如果不开启事务,默认情况下,dml操作是自动提交的,相当于每个dml操作都有单独的事务,开启和提交。不能回滚
  2. 如果一个事务,没有创建保存点,是默认有一个保存点在开启事务位置的,可以执行rollback,会回滚到事务开始的状态
  3. mysql的事务机制需要innodb存储引擎才能使用,MyISAM不支持
  4. 开启事务的方式有两种,还有一种是SET autocommit=off 或SET autocommit=0,相当于把单个dml事务的提交事务给关闭了

隔离级别

Mqsql隔离级别定义了事务与事务之间的隔离程度

脏读dirty read:当一个事务读取另一个事务尚未提交的修改时,产生脏读

不可重复读nonrepeatable read(这个重复是可以复现的意思,当出现了数据修改和删除,之前的数据就不可以复现了):同一查询在同一事务中多次进行,由于其他提交事务所做的修改,每次返回不同的结果集,此时发生不可重复读
这个对数据加上了行锁,对数据进行增加或者删除进行了限制,所以因其他修改会出现了幻读(不可重复读)

幻读phantom read:同一查询在同一事务中多次进行,由于其他提交事务所做的插入或者删除操作,每次返回不同的结果集,此时发生幻读
为什么修改不会幻读,因为事务锁住了所有的数据,无法对现有数据进行修改。所以不会导致这些问题,但是另一个事务可以通过插入(增加)数据的方式产生(增加类)幻读

Mysql隔离级别 脏读 不可重复读 幻读 加锁读
读未提交(read uncommitted) √ √ √ 不加锁
读已提交(read committed) × √ √ 不加锁
可重复读(repeatable read) × × × 不加锁
可串行化(serializable) × × × 加锁

不可重复读和幻读本质上是一样的东西。都是一个事务内两次读取同一些数据,结果不一样,都算是幻读。这个不可重复读,也太抽象了。使用行级锁可以解决更新和删除导致的幻读(不可重复读),间隙锁可以解决插入导致的幻读

可串行化,这个加锁相当于是一个单线程,同一时刻只有一个事务可以操作数据,可串行化级别的事务会等待另一个正在操作的事务结束

查询当前会话隔离级别:SELECT @@tx_isolation,此语法在mysql8.0版本中修改为了SELECT @@transaction_isolation
查询系统隔离级别:SELECT @@global.tx_isolation

设置当前会话隔离级别:SET SESSION TRANSACTION ISOLATION LEVEL 隔离级别
设置系统隔离级别:SET GLOBAL TRANSACTION ISOLATION LEVEL 隔离级别

Mysql默认的事务隔离级别是repeatable read

如果需要修改项目的隔离级别,我们可以在mysql的项目配置文件my.ini中添加transaction-isolation = repeatable-read

事务特性

  1. 原子性Atomicity

    原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生

  2. 一致性Consistency

    事务必须使数据库从一个一致性状态变换到另外一个一致性状态(事务结束前后,数据库的状态不会被改变。事务不会使数据库的状态改变)

  3. 隔离性Isolation

    事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离

  4. 持久性Durability

    持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

存储引擎

  1. Mysql的表类型由存储引擎(Storage Engines)决定,主要包括MyISAM、innoDB、Memory等

  2. Mysql数据表主要支持六种类型,分别是:CSV、Memory、ARCHIVE、MRG_MYISAM、MYISAM、InnoDB

  3. 这六种存储引擎又分为两类,一类是"事务安全型"(transaction-safe),比如InnoDB,其余都属于第二类,称为"非事务安全型"(non-transaction-safe)【mysiam和memory】

    事务安全型指的是是否支持事务

查看存储引擎

SHOW ENGINES可以查看mysql的存储引擎

修改存储引擎

ALTER TABLE table_name ENGINE = 引擎名

主要的存储引擎特点

特点 Myisam InnoDB Memory Archive
批量插入的速度 高 低 高 非常高
事务安全 支持
全文索引 支持
锁机制 表锁 行锁 表锁 行锁
存储限制 没有 64TB 有 没有
B树索引 支持 支持 支持
哈希索引 支持 支持
集群索引 支持
数据索引 支持 支持
索引缓存 支持 支持 支持
数据可压缩 支持 支持
空间使用 低 高 N/A 非常低
内存使用 低 高 中等 低
支持外键 支持

MyISAM

不支持事务,也不支持外键,但是访问速度快,对事务完整性没有要求

InnoDB

提供具有提交,回滚和崩溃恢复能力的事务安全,但是比起MyISAM存储引擎,InnoDB写的处理效率差一些,并且会占用更多的磁盘空间以保留数据和索引

MEMORY

使用内存中的内容来创建表,每个MEMORY表只实际对应一个磁盘文件,MEMORY类型的表访问的非常快,因为它的数据是放在内存中的,并且默认使用HASH索引,但是一旦服务关闭,表中的数据就会丢失掉,表的结构还在。

视图

视图是一个虚拟表,其内容由查询定义,同真实的表一样,视图包含字段,其数据来自对应的真实表(基表)(基表可以有多个),通过视图可以修改基表的数据 (这个视图相当于一个引用,引用了基表的部分字段)

基本语句

  1. create view 视图名 as select column1,column2 from table_name
  2. alter view 视图名 as select column1,column2 from table_name
  3. show create view 视图名
  4. drop view 视图名1,视图名2

视图还可以分离新的视图

视图的特性

  1. 安全

    一些数据表有着重要的信息,有些字段是保密的,不能让用户直接看到,这时就可以创建一个视图,在这张视图中只保留一部分字段,这样,用户就可以查询自己需要的字段,不能查看保密的字段

  2. 性能

    关系数据库的数据常常会分表存储,使用外键建立这些表的之间联系,这时,数据库查询通常会用到连接(JOIN)。这样做不但麻烦,效率相对也比较低,如果建立一个视图,将相关的表和字段组合在一起,就可以避免使用(JOIN)查询数据

  3. 灵活

    如果系统中有一张旧的表,这张表由于设计问题,即将被废弃,然而,很多应用都是基于这张表,不易修改,这时就可以建立一张视图,视图中的数据直接映射到新建的表,这样,就可以少做很多改动,也达到了升级数据表的目的

MySQL用户管理

意义
需要分离不同的权限,给不同的人。

Mysql的用户数据存储在系统数据库mysql的user表中
该表的字段host:代表允许登陆的地址,localhost表示该用户只允许本机登陆,也可以指定ip地址。
user:用户名
authentication_string:密码,存储的是mysql的password函数加密后的密码

创建用户
create user '用户名' @ '允许登录的地址' identified by '密码'
创建用户,并且指定密码

删除用户
drop user '用户名' @ '允许登录的地址'

修改本机密码

SET PASSWROD = PASSWORD('要修改的密码')

修改用户密码

SET PASSWOED FOR 'root'@'localhost' = PASSWORD('要修改对应用户的密码')

用户授权

授予用户权限

grant 权限列表 on XXX.xxx to '用户名'@'登录地址' 【identified by '密码'】

  1. 权限列表,多个权限用逗号分开

    grant select on ......

    grant select , delete , create on ......

    grant all [privileges] on ......//表示赋予该用户在该对象上的所有权限

  2. 特别说明

    .:代表本系统中的所有数据库的所有对象(表、视图、存储过程)

    库.*:代表某个数据库中的所有对象(表、视图、存储过程等)

  3. identified by 可以省略,也可以写出

    如果用户存在,就是修改该用户密码

    如果用户不存在,就是创建该用户

回收用户权限

revoke 权限列表 on 库.对象名 from '用户名'@'登录位置'

权限生效指令

如果权限没有生效,可以执行下面命令(低版本可能需要这步操作)

FLUSH PRIVILEGES

details

  1. 创建用户时,如果不指定地址,默认为%,所有地址都可连接
  2. 创建用户时,可以设置把%添加至ip的任何位置,如'xxx'@'192.168.1.%',表示用户xxx在192.168.1.*的ip可以登陆mysql
  3. 删除用户的时候,如果host不是%,需要明确指定'用户'@'host值'
posted @ 2021-09-06 08:07  灰线  阅读(84)  评论(0)    收藏  举报