03MySQL——DCL权限控制,四种常用函数解析
DCL-介绍
DCL英文全称是DataControl Language(数据控制语言),用来管理数据库用户、控制数据库的访问、权限。
DCL-管理用户
1查询用户:
USE mysql;
SELECT * FROM user;
2创建用户:
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
localhost是本地连接,%表示所有主机都可访问该数据库
3修改用户密码:
ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password by '密码';
mysql_native_password是加密算法,mysql密码必须经过加密存储
4删除用户:
DROP USER '用户名'@'主机名' ;
-- 查询用户
USE mysql;
select * from user;-- 创建用户 itcast,只能够在当前主机localhost访问,密码123456;
CREATE USER 'itcast'@'localhost' IDENTIFIED BY '123456';-- 创建用户 heima,可以在任意主机访问该数据库,密码123456;
CREATE USER 'heima'@'%' IDENTIFIED BY '123456';-- 修改用户 heima的访问密码为 1234;
ALTER USER 'heima'@'%' IDENTIFIED WITH mysql_native_password by '1234';-- 删除 itcast@localhost用户
DROP USER 'itcast'@'localhost' ;
DCL-权限控制
常用的权限列表
语法:
1查询权限:
SHOW GRANTS FOR '用户名'@'主机名' ;
2授予权限:
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';要授予全部权限可以用ALL表示,所有的数据库或表可以用*表示
3撤销权限:
REVOKE 权限列表 ON 数据库名.表名 FROM ‘用户名’@‘主机名’;
注意,多个权限之间用逗号分隔
-- 查看权限
SHOW GRANTS FOR 'heima'@'%';-- 授予'heima'@'%'用户对db01库中的所有表的所有权限
GRANT ALL ON db01.* TO 'heima'@'%';-- 授予'heima'@'%'用户对所有库中的所有表的所有权限
GRANT ALL ON *.* TO 'heima'@'%';-- 撤销'heima'@'%'用户对db01库中的所有表的select权限
REVOKE SELECT ON DB01.* FROM 'heima'@'%';-- 撤销'heima'@'%'用户对所有库中的所有表的所有权限
REVOKE ALL ON *.* FROM'heima'@'%';
函数
函数:是指一段可以直接被另一段程序调用的程序或代码
字符串函数
MySQL中内置了很多字符串函数,常用的几个如下:
-- concat(s1,s2) 拼接字符串
SELECT concat('hello ',' world');-- lower(s) 把所有字符变为小写
SELECT lower('HELLO');-- upper(s) 把所有字符变为大写
SELECT upper('Hello');-- lpad(s,n,'?') 固定输出五个字符,如果输出不足5个字符在左边补上-
SELECT lpad('1',5,'-');-- rpad(s,n,'?') 固定输出五个字符,如果输出不足5个字符在右边补上-
SELECT rpad('1',5,'-');-- trim(s) 去除字符串两边的空格,中间的去除
SELECT trim(' hello wrold ');-- substring(s.n1.n2) 从第一个字符开始,往后取7个字符
SELECT substring('hello world',1,7);-- 案例1.由于业务需要变更,企业员工的工号,统一为5位数,目前不足5位数的全部在前面补0。比如:1号员工的工号应该为00001。
UPDATE emp
SET workno = lpad(workno,5,'0');
数值函数
常见数值函数如下:
-- ceil(x) 向上取整,1.3取成2
SELECT ceil(1.3);-- floor (x) 向下取整,1.6取成1
SELECT floor(1.6);-- rand() 在0-1之间随机生成一个小数
SELECT rand();-- round (x,y) 使参数x保留y位小数
SELECT round(1.24,0);-- mod(x,y) 取余,相当于x%y
SELECT mod(4,3);-- 案例通过数据库的函数,生成一个六位数的随机验证码。
SELECT lpad(round(rand()*100000,0),6,'0');
日期函数
常见的日期函数如下:
-- curdate()获取当前的日期 年-月-日
SELECT curdate();-- curtime() 获取当前的时间 时-分-秒
SELECT curtime();-- now() 获取当前的日期加时间 年-月-日 时-分-秒
SELECT now();-- year month day 获取date的具体年月日
SELECT year(now());SELECT month(now());SELECT day(now());-- date_add(date,interval n type) 返回一个推迟后的时间
SELECT date_add(now(),interval 70 day);SELECT date_add(now(),interval 4 month);SELECT date_add(now(),interval 2 year);-- datediff(t1,t2) 计算两个时间之间差多少 ,t1-ty2
SELECT datediff('2022-2-4','2032-3-14');-- 案例:查询所有员工的入职天数,并根据入职天数倒序排序。
SELECT name,datediff(now(),entrydate)
FROM emp
ORDER BY datediff(now(),entrydate) desc;
流程函数
流程函数也是很常用的一类函数,可以在SQL语句中实现条件筛选,从提高语句的效率。
-- if(value,t,f) 如果value为真返回t,如果value为假返回f
SELECT if(true,'ok','error');
SELECT if(false,'ok','error');-- ifnull(value1,value2) 如果value1不为空返回value1,如果value1为空返回value2
SELECT ifnull('ok','error');
SELECT ifnull('','error');
SELECT ifnull(null,'error');-- case when then else end
-- 需求:查询emp表的员工姓名和工作地址(北京/上海---->一线城市,其他---->二线城市)
SELECT `name`,(case workaddress when '北京' then '一线城市' when '上海' then '一线城市' else '二线城市' end) AS '工作城市'
FROM emp;-- 需求:统计班级各个学员的成绩,展示的规则如下:
-- >=85 ,展示优秀
-- >=60,展示良好
-- 否则,展示不及格
SELECT name,(case when math >=85 then '优秀' when math >=60 then '良好' else '不及格' end) AS '数学成绩',(case when english>=85 then '优秀' when english >=60 then '良好' else '不及格' end) AS '英语成绩',(case when chinese >=85 then '优秀' when chinese >=60 then '良好' else '不及格' end) AS '语文成绩'FROM score;
这是我的个人学习笔记,主要用于记录自己对知识点的理解和梳理。由于目前仍在学习探索阶段,内容中难免存在理解偏差或表述疏漏,恳请各位大佬不吝赐教,多提宝贵意见~ 若有不同看法,欢迎理性交流探讨,感谢包容与指正!