一.单行函数
1.字符函数
1.1 length
获取字节个数 (注意不是字符数!!)
e.g.
select length(‘hello’);返回的是5
select length(“你好呀”);返回的是9(一个汉字占3个字节)
1.2 concat
拼接字符串
SELECT CONCAT(last_name,'~~',first_name) 姓名 FROM employees;
1.3 upper、lower
upper:将字符全部变成大写
lower:将字符全部变成小写
1.4 substr
截取字符串
#截取从指定索引处后面所有字符
SELECT SUBSTR('并肩于雪山之巅',4) AS out_put;
#截取从指定索引处指定字符长度的字符
SELECT SUBSTR('并肩于雪山之巅',1,3) AS out_put;
返回的是“并肩于”
注意:和Python不一样,sql中字符串的索引是从1开始的!!!
1.5 instr
返回子串第一次出现的索引,如果找不到返回0
SELECT INSTR('孤舟随烟波渡我','渡我') AS out_put;
返回6
SELECT INSTR('孤舟随烟波渡我','费') AS out_put;
返回0
1.6 trim
去掉字符串两端的指定子串,如果没有指定子串,那么默认为空白
SELECT TRIM(' 并肩于 雪山之巅 ') AS out_put;
SELECT TRIM('**' FROM '*****并肩于***雪山之巅****') AS out_put;
‘并肩于’前面有5个*,我们指定的子串是**,所以两个两个地删除,最后剩一个*。‘雪山之巅’后面有4个’*’,两个两个地删除,正好能删完。
1.7 lapd
用指定字符串左填充原始字符串到指定字符长度(不是字节长度!),当指定长度小于原始字符串的长度时,按指定长度截取原始字符串。
SELECT LPAD('并肩于雪山之巅',20,'*') AS out_put;
SELECT LPAD('并肩于雪山之巅',2,'*') AS out_put;
第一个返回:‘*************并肩于雪山之巅’
第二个返回:‘并肩’
1.8 rpad
用指定字符串右填充原始字符串到指定字符长度(不是字节长度!),当指定长度小于原始字符串的长度时,按指定长度截取原始字符串
SELECT RPAD('并肩于雪山之巅',12,'wx') AS out_put;
SELECT RPAD('并肩于雪山之巅',2,'wx') AS out_put;
第一个返回:‘并肩于雪山之巅wxwxw’
第二个返回:‘并肩’
1.9 replace
用指定字符串替换原始字符串中所有的另一指定字符串
SELECT REPLACE('忘羡忘羡忘羡忘羡很好听','忘羡','无羁') AS out_put;
返回:‘无羁无羁无羁无羁很好听’
2.数学函数
2.1 round
四舍五入
select round(-1.55);返回-2
select round(-1.5679,2);返回-1.57
2.2 truncate
保留指定小数位数
select truncate(-1.5679,2);返回-1.56
2.3 ceil
返回大于该数的最小整数
select ceil(-1.02);返回-1
select ceil(1.02);返回2
2.4 floor
返回小于该数的最大整数
select floor(-1.02);返回-2
select floor(1.02);返回1
2.5 mod 或 %
取余数
select mod(10,-3);返回1
select 10%-3;返回1
3.日期函数
3.1 now
返回当前系统日期+时间
select now() as 当前时间;
3.2 curdate
返回当前系统日期 (cur值current)
SELECT CURDATE();
3.3 curtime
返回系统当前时间,不包括日期
SELECT CURTIME();
3.4 year/month(monthname)/day/hour/minute/second
返回指定部分的年、月、日、时、分、秒
select year(now());返回2020
select month(now());返回3
select monthname(now());返回March (month返回数字,monthname返回英文)
select day(‘1997-12-01’);返回1
SELECT YEAR(hiredate) AS 年
FROM employees;
原始的hiredate长这个样子:
3.5 str_to_date
将某一字符串转换成"四位数年份-两位数月份-日期"的日期格式
SELECT STR_TO_DATE('1997-8-5','%Y-%c-%d') AS out_put;
#括号内第一个参数填入你要转换的字符串,第二个参数填入待转换字符串的格式
SELECT STR_TO_DATE('web生日是1997年08月5号','web生日是%Y年%m月%d号') AS 生日;
SELECT STR_TO_DATE('其实前面这些都是废话,今天是20年3月14号,祝大家白色情人节快乐','其实前面这些都是废话,今天是%y年%c月%d号,祝大家白色情人节快乐') AS 转换结果;
3.6 date_format
把日期格式转换成字符串
注意:这里的日期格式不单单指上述"四位数年份-两位数月份-日期"这样的日期格式
SELECT DATE_FORMAT('1997/08.05','小王出生于%y年,%c月,%d号。') AS 小王生日;
4. 流程控制函数
4.1 if函数
SELECT IF(22<29,'小王年纪小','小王年纪大') AS 结果;
condition为true,则返回扩号内第二个值,为false则返回第三个值
4.2 case函数
- case的第一种用法:
case 要判断的字段或表达式
when 常量1 then 要显示的值1或语句1;
when 常量2 then 要显示的值2或语句2;
…
else 要显示的值n或语句n;
end
/*案例:查询员工的工资,要求
部门号=30,显示的工资为1.1倍
部门号=40,显示的工资为1.2倍
部门号=50,显示的工资为1.3倍
其他部门,显示的工资为原工资
*/
SELECT salary AS 原始工资,
department_id,
CASE department_id
WHEN 30 THEN salary*1.1
WHEN 40 THEN salary*1.2
WHEN 50 THEN salary*1.3
ELSE salary
END AS 新工资
FROM employees;
- case的第二种用法:
case
when 条件1 then 要显示的值1或语句1
when 条件2 then 要显示的值2或语句2
。。。
else 要显示的值n或语句n
end
/*案例:查询员工的工资的情况
如果工资>20000,显示A级别
如果工资>15000,显示B级别
如果工资>10000,显示C级别
否则,显示D级别
*/
SELECT salary,
CASE
WHEN salary>20000 THEN 'A'
WHEN salary>15000 THEN 'B'
WHEN salary>10000 THEN 'C'
ELSE 'D'
END AS 工资级别
FROM employees;
二.分组函数
min,max,count,avg,sum
- 特点:
1.sum\avg一般用于处理数值型数据,max、min、count可以处理任意类型
2.分组函数都忽略了null值
3.可和distinct搭配实现去重运算