6.数据控制语言DCL
DCL,用来管理数据库用户、控制数据库的访问权限。
6.1 DCL-管理用户
查询用户
USE mysql -- use mysql SELECT * FROM user; -- select * from user;- 用户信息、用户访问权限存放在系统数据库mysql中的user表当中的
创建用户
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码'; -- create user '用户名'@'主机名' identified by '密码';- 创建用户指定用户名,主机名(即在哪个主机上可以访问该用户),identified by '密码'指的是当前用户的访问密码
修改用户密码
-- MySQL 5.7.6 及以上版本使用 ALTER USER '用户名'@'主机名' IDENTIFIED [WITH mysql_native_password] BY '新密码'; -- alter user '用户名'@'主机名' identified [with mysql_native_password] by '新密码'; -- MySQL 5.7.6 以下版本使用 SET PASSWORD FOR '用户名'@'主机名' = PASSWORD('new_password'); -- set password for '用户名'@'主机名' = password('new_password');修改用户名和主机名
RENAME USER '用户名'@'主机名' TO '新用户名'@'新主机名';删除用户
DROP USER '用户名'@'主机名'; drop user '用户名'@'主机名';注意:
主机名可以用%通配,表示所有主机
localhost代表当前主机,这类语言主要是DBA(数据库管理员)使用。
-- 创建用户 这里只能在主机'localhost'访问 create user 'yan'@'localhost' identified by '123456'; -- 创建用户 mie 可以在任意主机访问该数据库,密码123456 create user 'mie'@'%' identified by '123456'; -- 修改用户 yan 的访问密码为1234; alter user 'yan'@'localhost' identified with mysql_native_password by '1234'; -- 删除用户 drop user 'yan'@'localhost';6.2 DCL-权限控制
权限 | 说明 |
|---|---|
ALL, ALL PRIVILEGES | 所有权限 |
SELECT | 查询数据 |
INSERT | 插入数据 |
UPDATE | 修改数据 |
DELETE | 删除数据 |
ALTER | 修改表 |
DROP | 删除数据库/表/视图 |
CREATE | 创建数据库/表 |
查询权限
SHOW GRANTS FOR '用户名'@'主机名'; -- show grants for '用户名'@'主机名';授予权限
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名'; -- grant 权限列表 on 数据库.表名 to '用户名'@'主机名'; 把哪个数据库的哪个表的权限 授予 to----撤销权限
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名'; -- revoke 权限列表 on 数据库.表名 from '用户名'@'主机名';多个权限之间,使用逗号分隔
USAGE代表用户没有任何权限,创建一个用户后用户权限默认是USAGE
授权时,数据库名或表名可以使用
*通配符,代表所有数据库或表
-- 创建用户 这里只能在主机'localhost'访问 create user 'yan'@'localhost' identified by '123456'; -- 创建用户 mie 可以在任意主机访问该数据库,密码123456 create user 'mie'@'%' identified by '123456'; -- 修改用户 yan 的访问密码为1234; alter user 'yan'@'localhost' identified with mysql_native_password by '1234'; -- 删除用户 drop user 'yan'@'localhost'; -- 查询权限 show grants for 'mie'@'%'; -- 授予权限 grant all on wang.* to 'mie'@'%'; -- 撤销权限 revoke all on wang.* from 'mie'@'%';6.3 函数
函数:是指一段可以直接被另一段程序调用的程序或代码
6.3.1 字符串函数
函数 | 说明 |
|---|---|
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个长度的字符串(默认索引从1开始) |
SELECT 函数(参数);
select concat('Hello' , 'MySQL'); select lower('Hello'); select upper('Hello'); select lpad('01', 5, '-'); --左填充 select rpad('01', 5, '-'); --右填充 select trim(' Hello MySQL '); select substring('Hello MySQL',1,5);update employees set workID = lpad(workID, 5, '0');6.3.2 数值函数
函数 | 功能 |
|---|---|
CEIL(x) | 向上取整 |
FLOOR(x) | 向下取整 |
MOD(x,y) | 返回x/y的模 |
RAND() | 返回0~1内的随机数 |
ROUND(x,y) | 求参数x的四舍五入的值,保留y位小数 |
select ceil(1.1); select floor(1.9); select mod(3, 4); select mod(4, 3); select rand(); select round(2.345,2);select lpad(round(rand()*1000000 , 0), 6, '0');6.3.3 日期函数
函数 | 功能 |
|---|---|
CURDATE() | 返回当前日期(yyyy-mm-dd) |
CURTIME() | 返回当前时间(hh:mm:ss) |
NOW() | 返回当前日期和时间(yyyy-mm-dd hh:mm:ss) |
YEAR(date) | 获取指定date的年份 |
MONTH(date) | 获取指定date的月份 |
DAY(date) | 获取指定date的日期(每月的第几号) |
DATE_ADD(date,INTERVAL expr type) | 返回一个日期/时间值加上一个时间间隔expr后的时间值 |
DATEDIFF(date1,date2) | 返回起始时间date1和结束时间date2之间的天数(date1减date2) |
DATE_ADD(date,INTERVAL expr type)函数细节:
expr如果是正数,表示从时间date向后推,如果是负数就表示往前推,如果是0就表示是date本身
type常用的类型:YEAR(年)、MONTH(月)、DAY(天)、HOUR(小时)、MINUTE(分钟)、SECOND(秒)
select curdate(); select curtime(); select now(); select year(now()); select month(now()); select day(now()); select date_add(now(), INTERVAL 70 YEAR); select date_add(now(), INTERVAL 4 MONTH); select date_add(now(), INTERVAL 256 DAY); select datediff('2026-10-15', '2026-06-10');select name, datediff(curdate(), entrydate) as 'entrydays' from employees order by entrydays desc;6.3.4 流程函数
流程函数是常用的一类函数,可以在SQL语句中实现条件筛选,从而提高语句的效率。
函数 | 功能 |
|---|---|
IF(value, t, f) | 如果value为true,则返回t,否则返回f |
IFNULL(value1, value2) | 如果value1不为空,返回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 |
select if(true, 'OK' ,'Error'); select if(false, 'OK' ,'Error'); select ifnull('Ok', 'Default'); select ifnull(null, 'Default'); -- 查询employees表中的员工姓名和工作地址(北京/上海--->一线城市 , 其他----> 二线城市) -- CASE [ expr ] WHEN [ val1 ] THEN [ res1 ] … ELSE [ default ] END select name, (case workaddress when '北京' then '一线城市' when '上海' then '一线城市' else '二线城市' end ) as '工作地址' from employees;-- CASE WHEN [ val1 ] THEN [ res1 ] … ELSE [ default ] END select id, 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;