1.DCL-Data Control Language(数据控制语言)
粗体用来管理数据库用户、控制数据库的访问权限。
1.1、DCL-管理用户
1.1.1、查询用户
USE mysql;
SELECT * FROM user;
直接去mysql数据库的user表中查看用户及其权限
1.1.2、创建用户
CREATE USER '用户名'@'主机名' IDENTIFIED BY'密码';
1.1.3、修改用户密码
ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY'新密码'
1.1.4、删除用户
DROP USER'用户名'@'主机名'
注意:
- 主机名可以使用%通配
- 这类SQL开发人员操作的比较少,主要是DBA及运维人员使用
Example:
-- 创建用户icey,只能够在当前主机localhost访问,密码xxx
create user 'icey'@'localhost' identified by'xxx';
-- 创建用户小马,可以在任意主机访问该数据库,密码xxx
create user 'xiaoma'@'%' identified by'xxx';
-- 修改用户密码
alter user 'xiaoma'@'%' identified with mysql_native_password by 'xxxx';
-- 删除icey@localhost用户
drop user 'icey'@'localhost';
1.2、DCL-权限控制
权限 | 说明 |
---|---|
ALL,ALL PRIVILEGES | 所有权限 |
SELECT | 查询数据 |
INSERT | 插入数据 |
UPDATE | 修改数据 |
DELETE | 删除数据 |
ALTER | 修改表 |
DROP | 删除数据库/表/视图 |
CREATE | 创建数据库/表 |
1.2.1、查询权限
SHOW GRANTS FOR '用户名'@'主机名';
1.2.2、授予权限
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
1.2.3、撤销权限
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
注意:
- 多个权限之间,使用逗号分隔
- 授权时,数据库名和表名都可以*使用进行通配**,代表所有
- 超级权限.:给用户分配所有数据库所有表的所有权限
Example:
-- 查询权限
show grants for 'xiaoma'@'%';
-- 授予权限
grant all on usertable.* to 'xiaoma'@'%';
-- 撤销权限
revoke all on usertable.* from 'xiaoma'@'%';
2.函数
函数是指一段可以直接被另一段程序调用的程序或代码,已经在MySQL中内置了很多函数,我们只需要去调用它完成我们的业务需求。
2.1、字符串函数
P27图表 |
函数 | 功能 |
---|---|---|
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个长度的字符串 |
MySQL中内置了很多字符串函数,常用的几个如下:
-- concat
select concat('Hello' , ' MySQL');
-- lower
select lower('Hello');
-- upper
select upper('Hello');
-- lpad
select lpad('01', 5, '-');
-- rpad
select rpad('01', 5, '-');
-- trim
select trim(' Hello MySQL ');
-- substring,索引从1开始
select substring('Hello MySQL',1,5);
Example:
-- 1.由于业务需求变更,企业员工的工号,统一为5位数,目前不足5位数的全部在前面补0,
-- e.g.1号员工的工号应该为00001
update employee set workno = lpad(workno,5,'0')
2.2、数值函数
常用的数值函数如下: |
函数 | 功能 |
---|---|---|
CEIL(x) | 向上取整 | |
FLOOR(x) | 向下取整 | |
MOD(x,y) | 返回x/y的余数 | |
RAND( ) | 返回0~1之间的随机数 | |
ROUND(x,y) | 求参数x的四舍五入的值,保留y位小数 |
-- ceil,celing,只要小数位不是0,都会向上取整2
select ceil(1.1);
-- floor
select floor(1.9);
-- mod
select mod(3,4);
-- rand 0-1之间的随机数
select rand();
-- round
select round(2.345,2);
Example:
-- 通过数据库的函数,生成一个六位数的随机验证码
select rpad(round(rand()*1000000 , 0), 6, '0');
2.3、日期函数
常见的日期函数如下: |
函数 | 功能 |
---|---|---|
CURDATE( ) | 返回当前日期 | |
CURTIME( ) | 返回当前时间 | |
NOW( ) | 返回当前日期和时间 | |
YEAR(date) | 获取指定date的年份 | |
MONTH(date) | 获取指定date的月份 | |
DAY(date) | 获取指定date的日期 | |
DATE_ADD(date,INTERVAL expr type) | 返回一个日期/时间值加上一个时间间隔expr后的时间值 | |
DATEDIFF(date1,date2) | 返回起始时间date1和结束时间date2 |
-- 日期函数
-- cur --> current
-- curdate()
select curdate();
-- curtime()
select curtime();
-- now()
select now();
-- YEAR, MONTH, DAY
select YEAR(now());
select MONTH(now());
select DAY(now());
-- DATE_ADD interval为固定间隔多久
SELECT date_add(now(), INTERVAL 70 DAY);
-- DATEDIFF 2个指定时间之间相差的天数:a-b
SELECT datediff((curdate()), '2021-08-02');
Example:
-- 查询所有员工的入职天数,并根据入职天数倒序排序
SELECT name ,datediff(curdate(),entrydate) as 'entrydates' from employee order by entrydate;
2.4、流程函数
流程控制函数也是很常用的一类函数,可以在SQL语句中实现条件筛选,从而提高语句的效率
函数 | 功能 |
---|---|
IF(value,t,f) | 如果value为true,则返回true,否则返回false |
IFNULL(value1,value2) | 如果value不为空,返回value1,否则返回value2 |
CASE WHEN [val1] THEN [res1]...ELSE[default] END | 如果val1为true,返回res1,...否则返回default默认值 |
CASE[expr] WHEN [val1] THEN [res1]...ELSE[default] END | 如果expr的值等于val1,返回res1,...否则返回default默认 |
-- 流程函数 1st值用来做判断
-- if
select if(true,'ok', 'Error');
-- ifnull 判断值是否为空
select ifnull('Ok', 'Default');
select ifnull('', 'Default');
select ifnull(null, 'Default');
-- case when then else end
-- 需求:查询员工表的员工姓名和工作地址(北京/深圳 ---> 总部,其他 ---> 分部)
select name,
( case workaddress when '北京' then '总部' when '深圳' then '总部' else '分部' end ) as '工作地址'
from employee;