引言
sql(structured query language)是数据库管理的核心语言,涵盖数据操作(dml)、数据定义(ddl)、数据控制(dcl)等功能。本笔记详细解析用户提供的代码中涉及的dcl权限控制、字符串函数、数值函数、日期函数和流程控制函数,并结合案例说明应用场景。建议使用数据库可视化工具(如mysql workbench)执行查询并查看结果图表。
1. dcl权限控制
dcl(data control language)用于管理数据库访问权限,包括用户授权和撤销权限。关键命令:
- grant:授予用户权限,语法为
grant 权限 on 数据库.表 to '用户'@'主机'。grant all on itcast.* to 'itheima'@'%'; -- 授予用户itheima对itcast数据库的所有权限
- revoke:撤销用户权限,语法为
revoke 权限 on 数据库.表 from '用户'@'主机'。revoke all on itcast.* from 'itheima'@'%'; -- 撤销用户itheima对itcast数据库的所有权限
- show grants:查询用户权限。
show grants for 'itheima'@'%'; -- 显示用户itheima的权限
应用场景:控制用户对数据库的读写权限,确保数据安全。例如,管理员授予开发人员只读权限,防止误操作。
2. 字符串函数
字符串函数用于文本处理,包括拼接、大小写转换、填充和截取等。常见函数:
- concat(str1, str2):拼接字符串,如
concat('hello', 'mysql')返回 'hellomysql'。 - lower(str):转为小写,如
lower('hello')返回 'hello'。 - upper(str):转为大写,如
upper('hello')返回 'hello'。 - lpad(str, len, pad_str):左侧填充,如
lpad('01', 5, '-')返回 '---01'(长度5,左侧填充'-')。 - rpad(str, len, pad_str):右侧填充,如
rpad('01', 5, '-')返回 '01---'。 - trim(str):去除首尾空格,如
trim(' hello mysql ')返回 'hello mysql'。 - substring(str, start, len):截取子串,如
substring('hello mysql', 1, 5)返回 'hello'。
案例:统一工号格式,不足5位左侧补零。
update emp set workno = lpad(workno, 5, '0'); -- 将workno填充至5位,左侧补0
3. 数值函数
数值函数处理数学运算,包括取整、模运算和随机数生成:
- ceil(num):向上取整。
select ceil(1.1); -- 返回 2
- floor(num):向下取整。
select floor(1.1); -- 返回 1
- mod(a, b):模运算。
select mod(7, 4); -- 返回 3 (7 ÷ 4 余 3)
- rand():生成 $[0,1)$ 的随机数。
select rand(); -- 返回随机数如 0.752
- round(num, decimals):四舍五入
select round(2.345, 2); -- 返回 2.35
案例:生成6位随机验证码。
select lpad(round(rand()*1000000, 0), 6, '0'); -- 步骤:1. rand()*1000000 生成随机数;2. round 取整;3. lpad 左侧补0至6位
通过数据库函数,生成6位随机验证码,rand求随机数*1000000得随机数,round舍去后面小数,lpad在左侧补0保证6位数
4. 日期函数
日期函数处理时间数据,包括获取当前日期、提取成分和计算差值:
- curdate():返回当前日期,如 '2023-10-05'。
- curtime():返回当前时间,如 '14:30:00'。
- now():返回当前日期和时间,如 '2023-10-05 14:30:00'。
- year(date):提取年份
select year(now()); -- 返回当前年份
- month(date):提取月份
- day(date):提取日期
- date_add(date, interval expr type):添加时间间隔,如
date_add(now(), interval 70 year)返回当前日期加70年。 - datediff(date1, date2):计算日期差
select datediff('2021-12-01', '2021-11-01'); -- 返回 30
案例:计算员工入职天数并排序。
select name, datediff(curdate(), entrydate) as entrydays from emp order by entrydays asc;
5. 流程控制函数
流程控制函数实现条件逻辑,包括简单判断和分支选择:
- if(condition, true_val, false_val):条件判断,
如果为true返回ok,为false返回error
select if(true, 'ok', 'error'); -- 返回 'ok'
- ifnull(val, default):空值处理
ifnull,如果为空(null)则返回默认值,否则返回第一个字符
select ifnull(null, 'default'); -- 返回 'default'
- case when then else end:多分支条件,语法:
case when condition1 then result1 when condition2 then result2 else default end
case when then else end,当符合when的值时,返回then的值,否则返回else的值
-- 需求:查询emp表的员工姓名和工作地址(北京/上海----->一线城市,其他----->二线城市)
案例1:分类工作地址。
select name,
(case workaddress
when '北京' then '一线城市'
when '上海' then '一线城市'
else '二线城市'
end) as '工作地址'
from emp;
案例2:学员成绩分级(基于score表)。
select id, name, (case when math >= 85 then '优秀' when math >= 60 then '及格' else '不及格' end) '数学', (case when english >= 85 then '优秀' when english >= 60 then '及格' else '不及格' end) '英语', (case when chinese >= 85 then '优秀' when chinese >= 60 then '及格' else '不及格' end) '语文' from score;
数学表示:case 语句可视为分段函数,例如成绩分级:
案例:统计班级各个学员的成绩,展示的规则如下:
-- >=85 ,展示优秀
-- >=60 ,展示及格
-- 否则,展示不及格
6. 综合案例:学员成绩分析
用户创建了score表并插入数据:
create table score(
id int comment 'id',
name varchar(20) comment '姓名',
math int comment '数学',
english int comment '英语',
chinese int comment '语文'
) comment '学员成绩表';
insert into score values (1, 'tom', 67, 88, 95), (2, 'rose', 23, 66, 90), (3, 'jack', 56, 98, 76);
使用流程控制函数分级成绩:
select id, name, (case when math >= 85 then '优秀' when math >= 60 then '及格' else '不及格' end) '数学', -- 类似逻辑应用于英语和语文 from score;
结果示例(建议用表格展示):
| id | name | 数学 | 英语 | 语文 |
|---|---|---|---|---|
| 1 | tom | 及格 | 优秀 | 优秀 |
| 2 | rose | 不及格 | 及格 | 优秀 |
| 3 | jack | 及格 | 优秀 | 及格 |
配图建议:在数据库工具中执行查询,导出为csv或图表,展示成绩分布(如条形图显示各等级人数)。
总结
sql函数极大简化了数据处理:
- dcl 确保数据安全。
- 字符串函数 优化文本操作。
- 数值函数 支持数学计算。
- 日期函数 管理时间数据。
- 流程控制函数 实现复杂逻辑。 通过案例可见,这些函数在数据清洗(如工号格式化)、分析(如入职天数计算)和报表(如成绩分级)中广泛应用。建议练习更多场景以巩固技能,例如结合多函数处理实时数据。
到此这篇关于mysql dcl权限控制和简单函数的文章就介绍到这了,更多相关mysql dcl权限控制和函数内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论