1.DCL语句
DCL:数据控制语言,用来管理数据库用户,控制数据库的访问权限。
1.控制数据库有哪些用户可以访问。
2.控制每一个用户的访问权限。
1.1 DCL-管理用户
查询用户
USE mysql
SELECT * FROM user;
创建用户
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
修改用户密码
ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码';
删除用户
DROP USER '用户名'@'主机名';
练习:
1. 创建用户itcast,只能够在当前主机localhost访问,密码123456
CREATE USER 'itcast'@'localhost' IDENTIFIED BY '123456';
2. 创建用户lifiyu,可以在任意主机访问数据库,密码12345.
CREATE USER 'lifiyu'@'%' IDENTIFIED BY '12345';
3. 修改用户itcast 的访问密码1234;
ALTER USER 'itcast'@'localhost' IDENTIFIED WITH mysql_native_password BY '1234';
4.删除用户itcast
DROP USER 'itcast'@'localhost';
注意:
主机名可以使用%通配。(任意主机都可以访问mysql服务器)。
这类SQL开发人员操作的比较少,主要是DBA(数据库管理员)使用。
1.2 DCL-权限控制
MySQL中定义了很多种权限,但是常用的就以下几种:
查询权限
SHOW GRANTS FOR '用户名'@'主机名';
授予权限
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
撤销权限
REVOKE 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
注意:
多个权限之间,使用逗号分隔
授权时,数据库名和表名可以使用*进行通配,代表所有
2 函数
函数:是指一段可以直接被另一段程序调用的程序或代码。
2.1 字符串函数
MySQL中内置了很多字符串函数,常用的有如下几个:
练习:
--CONCACT连接字符串
SELECT CONCAT('HELLO','WORLD','!');
--LOWER将字符串转为小写
SELECT LOWER('HELLO');
--UPPER将字符串转为大写
SELECT UPPER('hello');
--LPAD左填充
SELECT LPAD('01',5,'-');
--RPAD右填充
SELECT RPAD('01',5,'-');
--TRIM去除空格(头部和尾部)
SELECT TRIM(' HE LLO ');
--SUBSTRING 截取字符串,并返回(索引从1开始)
SELECT SUBSTRING('HELLO',1,3);
练习:企业员工的工号统一为5位数,目前不足5位数的全部在前面补0,比如,1号员工的工号应该为00001
UPDATE employee SET worknumber = LPAD(worknumber,5,'0');
2.2 数值函数
--ceil 向上取值
SELECT CEIL(1.5); --2
--floor 向下取值
SELECT FLOOR(1.5); --1
--MOD 返回x/y的模(取余)
SELECT MOD(3,4); --3
--RAND 返回0-1内的随机数
SELECT RAND();
--ROUND 求参数X的四舍五入的值,保留y位小数
SELECT ROUND(2.346,2); -- 2.35
练习:通过数据库函数,生成一个六位数的随机验证码
SELECT LPAD(ROUND(RAND()*1000000 ,0),6,'0');
2.3 日期函数
--CRUDATE返回当前日期
SELECT CURDATE(); --2024-12-09
--CURTIME返回当前时间
SELECT CURTIME(); --14:20:55
--NOW返回当前日期和时间
SELECT NOW();
-- YEAR,--MONTH,--DAY 获取年、月、日
SELECT YEAR(NOW());
SELECT MONTH(NOW());
SELECT DAY(NOW());
--DATE_ADD 返回时间相加后的结果
SELECT DATE_ADD(NOW(),INTERVAL 70 DAY); --2025-02-17 14:29:57
--DATEDIFF 返回时间相差的天数(相减后)
SELECT DATEDIFF('2024-12-20','2024-12-31'); -- -11
练习:
查询所有员工的入职天数,并根据入职天数倒序排序。
SELECT name, datediff(CURDATE(), entrydate) AS 'entrydays' FORM employee ORDER BY entrydays DESC;
2.4 流程函数
--IF
SELECT if(true, 'ok','Error');
--IFNULL
SELECT IFNULL('OK','DEFAULT');
--CASE WHEN
需求:查询emp表的员工姓名和工作地址(北京/上海--> 一线城市,其它 --> 二线城市)
SELECT
name,
(CASE workaddress WHEN '北京' THEN '一线城市' HWEN '上海' then '一线城市' ELSE '二线城市' END) AS '工作地址' FROM emp;
练习: 统计班级各个学院的成绩,展示的规则如下: >= 85 ,展示优秀, >=60 展示及格,否则展示不及格
SELECT
id,
name,
(CASE WHEN math >= 85 then '优秀' WHEN math >= 60 THEN '及格' ELSE '不及格' END) AS '数学',
(CASE WHEN english >= 85 then '优秀' WHEN math >= 60 THEN '及格' ELSE '不及格' END) AS '英语',
(CASE WHEN chinese >= 85 then '优秀' WHEN math >= 60 THEN '及格' ELSE '不及格' END) AS '语文' FROM score;