MySQL中的函数主要分为以下四类:
- 字符串函数
- 数值函数
- 日期函数
- 流程函数
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个长度的字符串 |
A. concat : 字符串拼接
lua
select concat('Hello' , ' MySQL') as '结果';
-- 查询结果Hello MySql
B. lower : 全部转小写
lua
select lower('Hellow') as '结果';
-- 查询结果hellow
C. upper : 全部转大写
csharp
select upper('Hellow') as '结果';
D. lpad : 左填充
csharp
select lpad('Hello',10,'-') as '结果';
-- -----Hello
E. rpad : 右填充
csharp
select rpad('Hello',10,'-') as '结果';
-- Hello-----
F. trim : 去除空格
csharp
select trim(' Hello ') as '结果';
G. substring : 截取子字符串
csharp
select substr('Hello',2,3) as '结果';
由于业务需求变更,企业员工的工号,统一为5位数,目前不足5位数的全部在前面补0。比如: 1号员 工的工号应该为00001。
ini
update emp set workno = lpad(workno, 5, '0');
2.数值函数
常见的数值函数如下:
| 函数 | 功能 |
|---|---|
| CEIL(x) | 向上取整 |
| FLOOR(x) | 向下取整 |
| MOD(x,y) | 返回x/y的模 |
| RAND() | 返回0~1内的随机数 |
| ROUND(x,y) | 求参数x的四舍五入的值,保留y位小数 |
A. ceil:向上取整:2
csharp
select ceil(1.23);
B. floor:向下取整:1
csharp
select ceil(1.23);
C. mod:取模
csharp
select mod(5,2);
D. rand:获取随机数
csharp
select rand() ;
E. round:四舍五入:2.34
csharp
select round(2.344,2);
通过数据库的函数,生成一个六位数的随机验证码。
思路: 获取随机数可以通过rand()函数,但是获取出来的随机数是在0-1之间的,所以可以在其基础 上乘以1000000,然后舍弃小数部分,如果长
less
select lpad(round(rand()*1000000 , 0), 6, '0');
3.日期函数
常见的日期函数如下:
| 函数 | 功能 |
|---|---|
| CURDATE() | 返回当前日期 |
| CURTIME() | 返回当前时间 |
| NOW() | 返回当前日期和时间 |
| YEAR(date) | 获取指定date的年份 |
| MONTH(date) | 获取指定date的月份 |
| DAY(date) | 获取指定date的日期 |
| DATE_ADD(date, INTERVAL exprtype) | 返回一个日期/时间值加上一个时间间隔expr后的时间值 |
| DATEDIFF(date1,date2) | 返回起始时间date1 和 结束时间date2之间的天数 |
A. curdate:当前日期 YYYY-MM-DD
csharp
select CURDATE();
B. curtime:当前时间 HH:mm:ss
csharp
select CURTIME();
C. now:当前日期和时间 YYYY-MM-DD HH:mm:ss
csharp
select now();
D. YEAR , MONTH , DAY:当前年、月、日
vbscript
select YEAR(now());
select MONTH(now());
select DAY(now());
E. date_add:增加指定的时间间隔 :2070-01-01
sql
select date_add('2000-01-01', INTERVAL 70 YEAR );
F. datediff:获取两个日期相差的天数:9
csharp
select datediff('2000-10-10', '2000-10-01');
查询所有角色的发布天数,并根据发布天数倒序排序。
vbnet
select *, datediff(curdate(), release_date ) as 'entrydays'
from honor_of_kings_hero order by entrydays desc ;
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默认值 |
A. if
csharp
select if(false, 'Ok', 'Error');
B. ifnull
csharp
select ifnull('Ok','Default');
select ifnull('','Default');
select ifnull(null,'Default');
C. case when then else end
sql
create table score(
id int comment 'ID',
name varchar(20) comment '姓名',
math int comment '数学',
english int comment '英语',
chinese int comment '语文'
) comment '学员成绩表';
insert into score(id, name, math, english, chinese) 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 ) '数学',
(case when english >= 85 then '优秀' when english >=60 then '及格' else '不及格'end ) '英语',
(case when chinese >= 85 then '优秀' when chinese >=60 then '及格' else '不及格'end ) '语文'
from score;