目录
定义
是指一段可以直接使用或者被另一段程序使用的代码或程序。
例如:
公司的数据表中一般登记了员工的生日,但是更经常使用的应该是员工的年龄。
数据表中储存了学生的成绩,但是我希望能快速得到学生的成绩等级。
而想要快速实现这些目的,我们就需要一些内置函数来提高处理数据的效率。
字符串函数
-
CONCAT
select concat('hello','world');
命令的结构是将字符'hello'与字符'world'进行拼接,结果如下:
-
LOWER
select lower('Hello');
命令的结果是将字符串全部变成小写:
-
UPPER
select upper('Hallo');
命令的结果是将字符串全部变成大写:
注意:字符串要使用引号括起来!!!
-
LPAD、RPAD
select lpad('01',6,'-');
lpad函数中有三个参数,分别是字符,填充后长度,填充字符。
运行结果如下:
使用符号 - 向左填充 字符串 01 ,使得最后的字符串总长度为6。
同理也有向右填充
select rpad('01',6,'-');
-
TRIM
select trim(' my sql ');
该函数只有一个参数,但注意的是,TRIM函数只能将字符串首尾的字符删去,其中间的空格依然存在。
-
SUBSTRING
select substring('Hello_World!',1,5);
SUBSTRING函数有三个参数,分别是字符串、索引位置、截取长度。
PS:该函数的索引位置是从1开始的 ,与分页查询有所区别
数值函数
-
CEIL(X)
select ceil(1.1);
select ceil(1.6);
select ceil(-1.1);
向上取整,运行结果分别为2、2、-1
-
FLOOR(X)
select floor(1.1);
select floor(1.6);
select floor(-1.1);
向下取整,运行结果分别为1、1、-2
-
MOD
select mod(5,4);
select mod(3,4);
取模,运行结果分别是1、3
-
RAND
select rand();
会随机生成一个在0到1之间的小数
-
ROUND
select round(1.33,2);
select round(1.335,2);
四舍五入,运行结果分别是1.33、1.34
实例:
随机生成一个六位数的验证码
select round( rand()*1000000,0 );
函数时可以进行内套的,运行结果如下:
但是这段代码并没有完全六位数验证码的满足要求,因为有可能随机生成的数,第一位小数为零,那么这样产生的是一位五位数
所以需要进行填充操作
select lpad(round( rand()*1000000,0 ),6,0);
这样就能保证一定是六位数的验证码
日期函数
-
CURDATE
SELECT curdate();
会显示当前系统的年月日
-
CURTIME
select curtime();
显示当前系统的时间
-
NOW
会显示当前系统的日期+时间
-
YEAR(DATE)
select year(now());
-
MONTH(DATE)
select month(now());
-
DAY(DATE)
select day(now());
-
DATE_ADD
select date_add(now(),interval 10 day);
--从现在时间开始,经过10天后的时间
三个参数分别是,起始时间,interval(固定的),时间间隔,时间单位
-
DATEDIFF
select datediff('2023-6-7','2025-2-28');
计算两个时间的时间差,注意的是它的计算逻辑是:前者 - 后者
实例
计算所有员工的入职天数,并且按照倒序排序:
select *from users; --使用员工信息表
select name ,datediff( curdate(),entrydate ) as 'entrydays' from users order by entrydays desc;
--将用户的姓名按照入职天数倒序排序
流程函数
-
IF
select if(1+1=1,'ok','error');
IF函数中要传入三个参数,表达式、真值时输出、假值时输出
-
IFNULL
select ifnull('hello','default');
select ifnull('','default');
select ifnull(null,'default');
IFNULL是用来判断字符串是否为空,若不为空输出,若为空则将默认值输出
要注意的是,' ' (引号中什么也没有)并不是空,依然会将这个“空”输出,所以以上的运行结果为hello、空白、default
-
CASE WHEN THEN ELSE
形式1:
select user_name,user_address,
(case substring(user_address,1,2) when '北京' then '一线城市'
when '上海' then '一线城市'
else '二线城市' end) as '工作地址'
from users;
取员工地址的前两位,如果是北京或上海,就将其工作地址输出为一线城市,否则输出为而二线地址
形式2:
select case when user_address = '北京市' then '大佬' else '菜鸡' ;
总结
于是我们就可以回答,本文一开始提的两个问题:
- 公司的数据表中一般登记了员工的生日,但是更经常使用的员工的入职天数:使用DATEDIFF
- 数据表中储存了学生的成绩,但是我希望能快速得到学生的成绩等级:使用CADE WHEN THEN ELSE