回顾总结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;
函数
统计函数
- 统计函数count
SELECT count()|| count(列名) FROM table_name
count():统计满足条件的记录的行数
count(列):统计满足条件列的记录的数量,会排除null值
- 合计函数sum
仅对数值有用
SELECT sum(column1),sum(column2)... FROM table_name
- 平均函数avg
SELECT avg(column1),avg(column2)... FROM table_name
- 函数Max/Min
SELECT max(column1)... FROM table_name
字符串函数
- 字符集CHARSET(str)
SELECT CHARSET(column) FROM table_name
会将column的字符编码显示出来
- 字符串拼接CONCAT
SELECT CONCAT(column1,'str',column2) FROM table_name
会将column1 + str +column2 拼接成一个字符串显示出来
- 查询子串INSTR
SELECT INSTR('happy study java','study') FROM DUAL
会查询并返回'happy study java'中 'study'的位置
DUAL:亚元表,系统表,可以作为测试表使用
- 字符串大写UCASE
SELECT UCASE(column) FROM table_name
会将column列的值,转换成大写字符串
- 字符串小写LCASE
SELECT LCASE(column) FROM table_name
会将column列的值,转换成小写字符串
- 字符串快速截取LEFT、RIGHT
SELECT LEFT(column,2) FROM table_name
会将column的值从左边取2个显示
SELECT RIGHT(column,2) FROM table_name
会将column的值从右边取2个显示
- 字符串长度LENGTH[字节]
SELECT LENGTH(column) FROM table_name
会将column的值按字节返回长度
- 替换REPLACE
SELECT REPLACE (column,'MANAGER','经理') FROM table_name
会将column列下的所有'MANAGER'替换成'经理'
- 比较STRCMP
SELECT STRCMP(column1,column2) FROM table_name
会逐字符比较字符串column1和column2的大小,返回-1,0,1
- 截取SUBSTRING
SELECT SUBSTRING (column,1,3) FROM table_name
从column列第一个开始取,取三个字符显示出来。这里字符不从0开始哦。
如果第三个参数不写,就是从第二个参数位置选取后面所有字符
- 去空格LTRIM、RTRIM、TRIM
SELECT LTRIM('column') FROM table_name
去除column列左边的空格。RLTRM和TRIM同
数学函数
- 绝对值ABS
SELECT ABS(column) FROM table_name
返回column的绝对值
- 二进制转换BIN
SELECT BIN(column) FROM table_name
返回column的二进制形式
- 向上取整CEILING
SELECT CEILING(column) FROM table_name
返回column向上取整的最小整数
- 进制转换CONV
SELECT CONV(column,10,8) FROM table_name
将column的值从10进制转换成8进制
- 向下取整FLOOR
SELECT FLOOR(column) FROM table_name
返回column向下取整的最大整数
- 保留精度FORMAT
SELECT FORMAT(column,3) FROM table_name
将column保留3位小数(四舍五入)
该函数会将值转换成字符串,如果再跟其他值进行比较,会无结果,字符串和数字不能进行比较
- 转16进制HEX
SELECT HEX(column) FROM table_name
将column转换成16进制
- 求最小值LEAST
SELECT LEAST(column1,column2,column3,column4) FROM table_name
返回这些列中的最小值
- 求余MOD
SELECT MOD(column,3) FROM table_name
返回column % 3的值
- 随机数RAND(send)
SELECT RAND() FROM DUAL
返回一个随机数在0-1之间的数,如果给定一个种子send,会返回对应固定的一个随机数
日期函数
- CURRENT_DATE():当前日期
- CURRENT_TIME():当前时间
- CURRENT_TIMESTAMP():当前时间戳
INSERT INTO table_name VALUES(CURRENT_DATE());
- DATE(datetime):将日期时间,保留日期
SELECT id,content,DATE(send_time) FROM mes
将send_time日期时间的格式转换成了日期格式
- 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等
- DATEDIFF()时间差(单位天)
SELECT DATEDIFF('2011-11-11','1990-01-01') FROM DUAL
得出column1 - column2 的时间差(天),该值可以取负数
- TIMEDIFF()时间差(单位多少小时多少分钟多少秒)其他同上
- NOW():当前时间,年月日时分秒
- YERA|MONTH|DAY(datetime):取出datetime中的年或月或日
- UNIX_TIMESTAMP():返回的是1970-1-1到现在的秒数
- FROM_UNIXTIME(UNIX_TIMESTAMP() ,'%Y-%m-%d %H-%i-%s'):会将一个毫秒数,如UNIX_TIMESTAMP,转换成想要的格式
实际开发中,也会使用int保存一个nuix时间戳,然后使用from_unixtime进行转换
加密函数和系统函数
- USER():查看登录到mysql的有哪些用户,以及登录的IP
SELECT USER() FROM DUAL
- DATEBASE():查询当前使用数据库名称
SELECT DATEBASE FROM DUAL
后面的FROM DUAL都可以省略
- MD5(str):为字符串str算出一个通过MD5加密的16进制32位的字符串,存储在数据库中
SELECT MD5(column) FROM DUAL
- PASSWORD(str):加密函数
SELECT PASSWORD(column) FROM DUAL
流程控制函数
- IF(expr1,expr2,expr3):如果expr1为真,返回expr2,否则返回expr3
- IFNULL(expr1,expr2):如果expr1不为null,返回expr1,否则返回expr2
- SELECT CASE WHEN expr1 THEN expr2
WHEN expr3 THEN expr4
ELSE expr5 END:多重分支,如果expr1为真,返回expr2,如果expr3为真返回expr4,否则返回expr5
多表查询
多表查询是指基于两个和两个以上的表查询,在实际的应用中,查询单个表可能不能满足你的需求
SELECT * FROM emp , dept
多表查询
默认情况下,当两个表查询时
- 从第一张表中,取出一行,和第二张表的每一行进行组合,返回结果是【含有两张表的所有列】
- 一共返回的记录数,是第一张表的行数*第二张表的行数
- 这样多表查询默认处理返回的结果,称为笛卡尔集
- 解决这个多表的关键就是要写出正确的过滤条件where
- 将两个表中有关联(相同的列)连接起来,不同的过滤掉
多表查询时的条件不能少于表的个数 - 1,因为每连接一个表,就需要一个条件,否则会出现笛卡尔集
自连接
把同一张表当做两张表使用
将原表复制一份,与自己连接查询。变成了另一种多表查询
此时需要给表取别名,然后使用表别名调用列名
例:SELECT worker.ename,boss.ename
FROM emp worker , emp boss
WHERE worker.mgr = boss.empno;
子查询
查询跟SMITH相同部门的员工,首先我们要知道部门编号
-
单行子查询(嵌套查询)
SELECT deptno FROM emp WHERE ename = 'SMITH'
查询出来ename名为SMITH的部门编号deptno的值
然后根据编号,查询表
SELECT * FROM emp WHERE deptno = (
SELECT deptno FROM emp WHERE ename = 'SMITH' ) -
多行子查询
此时不能使用单行子查询的 = 符号了,需要使用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语句,借助一个新表。
- 创建一个新表,和原表的结构一样,使用LIKE语句创建
- 将原表的数据转移到新表,加上DISTINCT语句去重
- 改新表表名,删旧表。或者再转移一次数据,删新表
表的并集
UNION 和 UNION ALL
UNION ALL 会将所有数据并集在一起,并且不会去重,如果有两条一样的数据,会都存在
UNION 会将所有数据并集在一起,但是会去重,不会有重复的数据
左外连接和右外连接
SELECT ... FROM 左表 LEFT JOIN 右表 ON 条件
显示所有左表信息或者右表信息。没有关联的列显示为空
表的属性
主键 Primary key
-
primary key不能重复而且不能为null
-
一张表最多只能有一个主键,但可以是复合主键
-
主键的指定方式,有两种
直接在字段名后指定:字段名 primary key
在表定义最后写 primary key(列名);
-
使用desc 表名,可以看到primary key的情况
-
每个表往往都会设计一个主键
约束
-
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
- 外键指向的表的字段,要求是primary key或者是unique
- 表的类型是innodb,这样的表才支持外键
- 外键字段的类型要和主键字段的类型一致(长度可以不同)
- 外键字段的值,必须在主键字段中出现过,或者为null【前提是外键字段允许为nill】
- 一旦建立主外键关系,数据就不能随意删除了
- 外键是从表的字段,指向主表。
索引
提高数据库性能,不用加内存,不用改程序,不用调sql,查询速度可以提高百倍千倍
CREATE INDEX empno_index ON emp(empno)
索引也是数据,会增加存储空间。且,每个索引只对应一列,其他没有索引的效果没有任何改变。
索引的代价
- 磁盘的占用
- 对表进行dml(修改、删除、添加)操作的效率有影响
索引类型
- 主键索引,主键自动的为主索引(primary key)
- 唯一索引(unique)
- 普通索引(index)
- 全文索引(fulltext)【适用于MyISAM】
开发中一般不使用mysql自带的全文索引,而是考虑使用Solr和ElasticSearch(ES)
索引操作
-
显示索引
SHOW INDEX FROM table_nameSHOW INDEXES FROM table_name
SHOW KEYS FROM table_name
-
添加索引
-
主键索引:如果将字段设为主键,则自带有主键索引。
-
唯一索引:CREATE UNIQUE INDEX 索引名 ON 表名(字段)
-
普通索引,方式一:CREATE INDEX 索引名 ON 表名(字段)
方式二:ALTER TABLE 表名 ADD INDEX 索引名 (字段)
如果某字段的值,不会重复的话,优先考虑使用unique索引,否则使用普通索引
-
-
删除索引
DROP INDEX 索引名 FROM 表名- 删除主键索引
ALTER TABLE 表名 DROP PRIMARY KEY
- 删除主键索引
总结
那些字段上适合使用索引
- 较为频繁的作为查询条件字段应该创建索引
- 唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件
- 更新非常频繁的字段不适合创建索引
- 不会出现在where子句中字段不该创建索引
事务
用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml语句要么全部成功,要么全部失败,如:转账就要用事务来处理,用以保证数据的一致性
这个事务,最好在表中开启,事务管理的是dml语句,创建表是ddl语句,先开启事务,后开启表,他是管理不到ddl语句的,并且,创建表后,每个dml语句执行时,会开启autotransaction,自动提交,创建表之前创建的事务会被顶替
事务和锁
当执行事务操作时(dml语句),mysql会在表上加锁,防止其他用户改表的数据,这对用户来讲是非常重要的。
mysql数据库控制台事务的几个操作
- start transaction:开始一个事务
- savepoint 保存点 名:设置保存点
- rollback to 保存点 名:回退事务
- rollback:回退全部事务
- commit:提交事务,所有的操作生效,不能回退
保存点savepoint
是事务所定义的一个在sql语句的位置,用于取消部分事务。
回退事务rollback
当结束事务时,会自动的删除该事务所定义的所有保存点。执行回退事务时(commit),通过制定保存点可以回退到指定的位置
提交事务commit
使用commit语句可以提交事务,当执行了commit语句子句后,会确认事务的变化,结束事务,删除保存点,释放锁,数据生效。当使用commit语句结束事务后,其它会话将可以查看到事务变化后的新数据(正式生效,相当于上传服务器)
details
- 如果不开启事务,默认情况下,dml操作是自动提交的,相当于每个dml操作都有单独的事务,开启和提交。不能回滚
- 如果一个事务,没有创建保存点,是默认有一个保存点在开启事务位置的,可以执行rollback,会回滚到事务开始的状态
- mysql的事务机制需要innodb存储引擎才能使用,MyISAM不支持
- 开启事务的方式有两种,还有一种是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
事务特性
-
原子性Atomicity
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
-
一致性Consistency
事务必须使数据库从一个一致性状态变换到另外一个一致性状态(事务结束前后,数据库的状态不会被改变。事务不会使数据库的状态改变)
-
隔离性Isolation
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离
-
持久性Durability
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
存储引擎
-
Mysql的表类型由存储引擎(Storage Engines)决定,主要包括MyISAM、innoDB、Memory等
-
Mysql数据表主要支持六种类型,分别是:CSV、Memory、ARCHIVE、MRG_MYISAM、MYISAM、InnoDB
-
这六种存储引擎又分为两类,一类是"事务安全型"(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索引,但是一旦服务关闭,表中的数据就会丢失掉,表的结构还在。
视图
视图是一个虚拟表,其内容由查询定义,同真实的表一样,视图包含字段,其数据来自对应的真实表(基表)(基表可以有多个),通过视图可以修改基表的数据 (这个视图相当于一个引用,引用了基表的部分字段)
基本语句
- create view 视图名 as select column1,column2 from table_name
- alter view 视图名 as select column1,column2 from table_name
- show create view 视图名
- drop view 视图名1,视图名2
视图还可以分离新的视图
视图的特性
-
安全
一些数据表有着重要的信息,有些字段是保密的,不能让用户直接看到,这时就可以创建一个视图,在这张视图中只保留一部分字段,这样,用户就可以查询自己需要的字段,不能查看保密的字段
-
性能
关系数据库的数据常常会分表存储,使用外键建立这些表的之间联系,这时,数据库查询通常会用到连接(JOIN)。这样做不但麻烦,效率相对也比较低,如果建立一个视图,将相关的表和字段组合在一起,就可以避免使用(JOIN)查询数据
-
灵活
如果系统中有一张旧的表,这张表由于设计问题,即将被废弃,然而,很多应用都是基于这张表,不易修改,这时就可以建立一张视图,视图中的数据直接映射到新建的表,这样,就可以少做很多改动,也达到了升级数据表的目的
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 '密码'】
-
权限列表,多个权限用逗号分开
grant select on ......
grant select , delete , create on ......
grant all [privileges] on ......//表示赋予该用户在该对象上的所有权限
-
特别说明
.:代表本系统中的所有数据库的所有对象(表、视图、存储过程)
库.*:代表某个数据库中的所有对象(表、视图、存储过程等)
-
identified by 可以省略,也可以写出
如果用户存在,就是修改该用户密码
如果用户不存在,就是创建该用户
回收用户权限
revoke 权限列表 on 库.对象名 from '用户名'@'登录位置'
权限生效指令
如果权限没有生效,可以执行下面命令(低版本可能需要这步操作)
FLUSH PRIVILEGES
details
- 创建用户时,如果不指定地址,默认为%,所有地址都可连接
- 创建用户时,可以设置把%添加至ip的任何位置,如'xxx'@'192.168.1.%',表示用户xxx在192.168.1.*的ip可以登陆mysql
- 删除用户的时候,如果host不是%,需要明确指定'用户'@'host值'
标签:事务,20,name,column,查询,回顾总结,table,SELECT 来源: https://www.cnblogs.com/lxycc/p/15232187.html