(1-7-6)Mysql 常用的基本函数
目录
0. 前置总结
1. 数字函数
2. 日期函数
2.1 获取系统时间函数 now()、curdate()、curtime()
2.2 日期格式化函数 date_format
(1) 查询员工的入职年份
(2)利用日期函数, 查询今年、明年自己的生日是 星期几
(3)使用日期函数,查询1981年下半年 入职的员工
2.3 日期偏移计算
(1) 查询 50 天后是 哪一天?
(2) 查询 2025-10-04 后 3个月后的9天 是哪一天?
(3) 查询 2026/01/13 与 2025-10-04相差多少天
3. 字符函数
(1)查询每个员工的大写、 小写姓名 、 姓名长度、 底薪后连接 “$”, 查找姓名中“A”中出现的位置
(2) insert()和replace() 用法
(3)截取“你好呀,世界!”中的“世界”
(4)手机号的后四位 覆盖为 “*”
(5) 将姓名进保留 最前的一个性字,其余用“*”覆盖
(6)tirm 清空前后空白空格
4. 条件函数
4.1 if & ifnull
(1) “RESEARCH” 部门发放“礼品A”,其余部门发放礼品“礼品B”,打印每名员工获得的礼品。
4.2 case -when- then
(1) SALES 部门去 P1 地点,ACCOUNTING 部门去 P2 地点,RESEARCH 部门去 P3 #地点,打印各部门员工的所去地
(2)update-bigDemo 调整薪资
0. 前置总结
- 数字函数
- abs、round、floor
- ceil、power、log
- ln、 sqrt、 pi
- sin、 cos、 tan
- cot、 radians、 degrees
- 字符函数
- upper、 lower 、 char_length
- concat、 instr
- 日期函数 & 条件函数
- now、 date_format、 date_add
- datediff 、 if 、 ifnull
1. 数字函数
demo1:
# 数字函数# (1) abs --> 100
select abs(-100);# (2) round --> 3.1400
select round(3.1415 * 100)/100;# (3) floor --> 8
select floor(8.8);# (4) ceil --> 9
select ceil(8.1);# (5) power --> 32
select power(2,5);# (6) log --> 0.31546
select log(9, 2);# (7) ln --> 2.995
select ln(20);
demo2:
# (8) sqrt --> 4
select sqrt(16);# (9) pi --> 3.141593
select pi();# (10) sin --> 0.9092
select sin(2);# (11) cos --> 0.07073
select cos(1.5);# (12) tan --> 0.6420
select cot(1);# (13) radians --> 1.0471
select radians(60);# (14) degrees --> 57.29577
select degrees(1);
2. 日期函数
2.1 获取系统时间函数 now()、curdate()、curtime()
# 获取系统时间函数# (1) now() --> 2025-07-30 15:10:48
select now();# (2) curdate() --> 2025-07-30
select curdate();# (3) curtime() --> 15:12:26
select curtime();
2.2 日期格式化函数 date_format
(1) 查询员工的入职年份
### 日期格式化函数 date_format# (4) 查询员工的入职年份
select ename, date_format(hiredate, "%Y") as year
from t_emp
(2)利用日期函数, 查询今年、明年自己的生日是 星期几
# (5) 利用日期函数, 查询今年、明年自己的生日是 星期几
select date_format("2025-10-04", "%W") as this_year_bri,
date_format("2026-10-04","%W") as next_year_bri;
(3)使用日期函数,查询1981年下半年 入职的员工
# (6) 使用日期函数,查询1981年下半年 入职的员工
select ename, hiredate
from t_emp
where date_format(hiredate, "%Y") = 1981
and date_format(hiredate, "%m") >6;
2.3 日期偏移计算
(1) 查询 50 天后是 哪一天?
# (7) 查询 50 天后是 哪一天?
select date_add(now(), interval 50 day);
(2) 查询 2025-10-04 后 3个月后的9天 是哪一天?
# (8) 查询 2025-10-04 后 3个月后的9天 是哪一天?
select
date_format(
date_add(
date_add(("2025-10-04"), interval + 3 month),
interval + 9 day),
"%Y/%m/%d");
(3) 查询 2026/01/13 与 2025-10-04相差多少天
# (9) 查询 2026/01/13 与 2025-10-04相差多少天
select datediff("2026-01-13", "2025-10-04");
3. 字符函数
(1)查询每个员工的大写、 小写姓名 、 姓名长度、 底薪后连接 “$”, 查找姓名中“A”中出现的位置
# 字符函数
# (1) 查询每个员工的大写、 小写姓名 、 姓名长度、 底薪后连接 “$”, 查找姓名中“A”中出现的位置
select
lower(ename), upper(ename), length(ename), concat(sal, "$"), instr(ename, "A")
from t_emp
(2) insert()和replace() 用法
(3)截取“你好呀,世界!”中的“世界”
# (3) 截取“你好呀,世界!”中的“世界”
select substr("你好呀,世界!", 5, 2), substring("你好呀,世界!", 5, 2);
(4)手机号的后四位 覆盖为 “*”
# (4) 手机号的后四位 覆盖为 “*”
select lpad(substring("15512345678", 8, 4), 11, "*");
(5) 将姓名进保留 最前的一个性字,其余用“*”覆盖
# (5) 将姓名进保留 最前的一个性字,其余用“*”覆盖
# base
select substring("剖好的为", 1, 1);
select rpad(substring("剖好的为", 1, 1), length("剖好的为")/3, "*");
(6)tirm 清空前后空白空格
4. 条件函数
4.1 if & ifnull
(1) “RESEARCH” 部门发放“礼品A”,其余部门发放礼品“礼品B”,打印每名员工获得的礼品。
# 1. ifnull() & if( , , )
# (1) “RESEARCH” 部门发放“礼品A”,其余部门发放礼品“礼品B”,打印每名员工获得的礼品。
select em.ename, de.dname, if(de.dname = "RESEARCH", "礼品A", "礼品B")
from t_emp em join t_dept de
on em.deptno = de.deptno
4.2 case -when- then
(1) SALES 部门去 P1 地点,ACCOUNTING 部门去 P2 地点,RESEARCH 部门去 P3 #地点,打印各部门员工的所去地
# (2) SALES 部门去 P1 地点
# ACCOUNTING 部门去 P2 地点
# RESEARCH 部门去 P3 #地点,打印各部门员工的所去地
select em.ename, de.dname,
CASE WHEN de.dname = "SALES" THEN "P1"WHEN de.dname = "ACCOUNTING" THEN "P2"WHEN de.dname = "RESEARCH" THEN "P3"
END as place
from t_emp em join t_dept de
on em.deptno = de.deptno
(2)update-bigDemo 调整薪资
需求:
base:
# base0 查询各部门员工的工资
select em.ename, em.deptno, de.dname, em.sal
from t_emp em left join t_dept de
on em.deptno = de.deptno
order by de.deptno # base1 分组查询每个部门的平均薪资
select deptno, avg(sal) as avg
from t_emp em
group by deptno# base2
select em.ename, em.deptno, de.dname, em.sal, de_av.avg
from t_emp em
left join t_dept de on em.deptno = de.deptno
left join (select deptno, avg(sal) as avg from t_emp em group by deptno) de_av on em.deptno = de_av.deptno
order by de.deptno
# update
UPDATE t_emp em
LEFT JOIN t_dept de ON em.deptno = de.deptno
LEFT JOIN (SELECT deptno, AVG(sal) AS avg_sal FROM t_emp GROUP BY deptno
) de_av ON em.deptno = de_av.deptno
SET em.sal = CASE WHEN de.dname = "SALES" AND DATEDIFF(NOW(), em.hiredate)/365 >= 20 THEN em.sal * 1.1WHEN de.dname = "SALES" AND DATEDIFF(NOW(), em.hiredate)/365 < 20 THEN em.sal * 1.05WHEN de.dname = "ACCOUNTING" THEN em.sal + 500WHEN de.dname = "RESEARCH" AND em.sal < de_av.avg_sal THEN em.sal + 120WHEN em.deptno is null then em.sal + 100ELSE em.sal
END;