DCL
DCL英文全称是Data Control Language(数据控制语言),用来管理数据库用户、控制数据库的访问权限。
管理用户
1). 查询用户
use mysql;
select * from user;select * from mysql.user;
查询的结果如下:
其中 Host代表当前用户访问的主机, 如果为localhost, 仅代表只能够在当前本机访问,是不可以远程访问的。 User代表的是访问该数据库的用户名。在MySQL中需要通过Host和User来唯一标识一个用户。
2). 创建用户
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
3). 修改用户密码
#mysql8.0
ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码' ;
4). 删除用户
DROP USER '用户名'@'主机名' ;
注意事项:
在MySQL中需要通过用户名@主机名的方式,来唯一标识一个用户。
主机名可以使用 % 通配。
这类SQL开发人员操作的比较少,主要是DBA( Database Administrator 数据库管理员)使用。
案例:
A. 创建用户donkee, 只能够在当前主机localhost访问, 密码123456;
create user 'donkee'@'localhost' identified by '123456';
B. 创建用户andy, 可以在任意主机访问该数据库, 密码123456;
create user 'andy'@'%' identified by '123456';
C. 修改用户andy的访问密码为1234;
--mysql8.0
alter user 'andy'@'%' identified with mysql_native_password by '1234';
Mysql 5.7 修改密码的三种方式
通过管理员修改密码
set password [for 'username'@'host' ]= password('password');修改mysql.user表修改密码
use mysql; update user set authentication_string = password('password') where user='username' and host='host'; flush privileges;旧版本中密码字段是password,而不是authentication_string,必须刷新权限!!!!
忘记root密码重置密码
在my.ini配置文件[mysqld]下添加skip-grant-tables,
重启数据库服务mysql直接无密码登陆,
修改mysql.user表中的密码,
注释skip-grant-tables该参数重启数据库服务即可
D. 删除 donkee@localhost 用户
drop user 'donkee'@'localhost';
权限控制
MySQL中定义了很多种权限,但是常用的就以下几种:
权限 | 说明 |
ALL, ALL PRIVILEGES | 所有权限 |
SELECT | 查询数据 |
INSERT | 插入数据 |
UPDATE | 修改数据 |
DELETE | 删除数据 |
ALTER | 修改表 |
DROP | 删除数据库/表/视图 |
CREATE | 创建数据库/表 |
上述只是简单罗列了常见的几种权限描述,其他权限描述及含义,可以直接参考官方文档。
1). 查询权限
SHOW GRANTS FOR '用户名'@'主机名' ;
USAGE: 游客
2). 授予权限
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
3). 撤销权限
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
注意事项:
多个权限之间,使用逗号 分隔
授权时, 数据库名和表名可以使用 * 进行通配,代表所有。
案例:
A. 查询 'andy'@'%' 用户的权限
show grants for 'andy'@'%';
B. 授予 'andy'@'%' 用户test_db数据库所有表的所有操作权限
grant all on test_db.* to 'andy'@'%';
C. 撤销 'andy'@'%' 用户的test_db数据库的所有权限
revoke all on test_db.* from 'andy'@'%';
函数
函数是指一段可以直接被另一段程序调用的程序或代码。 也就意味着,这一段程序或代码在MySQL中已经给我们提供了,我们要做的就是在合适的业务场景调用对应的函数完成对应的业务需求即可。 那么,函数到底在哪儿使用呢?
我们先来看两个场景:
1). 在企业的OA或其他的人力系统中,经常会提供的有这样一个功能,每一个员工登录上来之后都能 够看到当前员工入职的天数。 而在数据库中,存储的都是入职日期,如 2000-11-12,那如果快速计算出天数呢?
2). 在做报表这类的业务需求中,我们要展示出学员的分数等级分布。而在数据库中,存储的是学生的 分数值,如98/75,如何快速判定分数的等级呢?
其实,上述的这一类的需求呢,我们通过MySQL中的函数都可以很方便的实现 。
MySQL中的函数主要分为以下四类: 字符串函数、数值函数、日期函数、流程函数。
字符串函数
MySQL中内置了很多字符串函数,常用的几个如下:
函数 | 功能 |
CONCAT(S1,S2,...Sn) | 字符串拼接,将S1,S2,... Sn拼接成一个字符串 |
LOWER(str) | 将字符串str全部转为小写 |
UPPER(str) | 将字符串str全部转为大写 |
LPAD(str,n,pad) | 左填充,用字符串pad对str的左边进行填充,达到n个字符串长度 |
RPAD(str,n,pad) | 右填充,用字符串pad对str的右边进行填充,达到n个字符串长度 |
TRIM(str) | 去掉字符串头部和尾部的空格 |
SUBSTRING(str,start,len) | 返回从字符串str从start位置起的len个长度的字符串 |
演示如下:
A. concat : 字符串拼接
select concat('Hello' , ' MySQL');
B. lower : 全部转小写
select lower('Hello');
C. upper : 全部转大写
select upper('Hello');
D. lpad : 左填充
select lpad('01', 5, '-');
E. rpad : 右填充
select rpad('01', 5, '-');
F. trim : 去除空格
select trim(' Hello MySQL ');
G. substring : 截取子字符串
select substring('Hello MySQL',1,5);
案例:
由于业务需求变更,企业员工的工号,统一为5位数,目前不足5位数的全部在前面补0。比如:1号员工的工号应该为00001。
update emp set workno = lpad(workno, 5, '0');
处理完毕后, 具体的数据为: