写在之前

现在我们进入函数部分。这个MySQL的函数部分,基本就相当于java中的方法。

MySQL函数

好处:

1、隐藏了实现细节
2、提高代码的重用性

调用:

select 函数名(实参列表) 【from 表】;

分类:

1、单行函数
2、分组函数(统计函数)

单行函数

一、字符函数
1、length
:获取参数值的字节个数

eg.
select length('john');  #结果 4
select length('哈哈哈'); #结果 根据编码不同,结果不同
# 注意:在gbk中一个汉字占2个字节,在utf-8中一个汉字占3个字节
2、concat
:拼接字符串

select concat(字符1,'_',字符2) from 表明;
#将查询结果的多个字段连接在一起输出
3.1、upper
:小写变大写

3.2、lower
:大写变小写

eg.
upper('john');
lower('JOHN');
4、substr 或者 substring
select substr('老鼠爱大米',4); #结果 大米
#截取从指定索引处后面所有的字符(包括当前位置)
注意:索引从1开始

select substr('老鼠爱大米',1,2); #结果 老鼠
#截取从指定索引处指定字符长度的字符
5、instr
:返回字串第一次出现的索引,如果找不到返回0
注意:第一次

eg.
select instr('老鼠爱大米','大米'); #结果 4
6、trim
:①去除字符前后的空格
  ②去除前后的特定字符
 注意:只会去除前后的,中间的不管

eg.
去除前后空格
select trim('      老鼠      ');  #结果  老鼠(空格去掉)

去除前后特定字符
select trim('a' from 'aaaaaaaa老aaaa鼠aaaaa'); #结果 老aaaa鼠
7、lpad
:用指定的字符实现左填充指定长度
即:若字符长度不够,左填充指定字符以达到指定长度
若字符长度超过指定长度,会截断(即只显示指定的长度)

select lpad('老鼠爱大米',10,'*');  #结果 *****老鼠爱大米

select lpad('老鼠爱大米',2,'*');  #结果 老鼠
8、rpad
:用指定的字符实现右填充指定长度
同样,若字符长度超过指定长度,会截断(只显示前特定长度的字符)

select rpad('老鼠爱大米',12,'ab'); #结果 老鼠爱大米abababa

select rpad('老鼠爱大米',2,'ab'); #结果 老鼠
9、replace
:替换
select replace(字符1,字符2,字符3);
用字符3去替换字符1中的所有出现的字符2

select replace('老鼠爱大米','老鼠','仓鼠');  #结果 仓鼠爱大米

select replace('老鼠爱大老鼠米老鼠老鼠','老鼠','仓鼠'); #结果 仓鼠爱大仓鼠米仓鼠仓鼠
二、数学函数
1、round
:四舍五入

select round(1.65);  #结果 2
select round(1.45);  #结果 1
select round(-1.55);  #结果 -2
select round(-1.35);  #结果 -1

可选择保留几位小数
select round(1.657,2);  #结果 1.66
select round(203,2);  #结果 203
2、ceil
:向上取整
返回 >= 该参数的最小整数

select ceil(0.01);  #结果 1
select ceil(1.00);  #结果 1
select ceil(-1.02);  #结果 -1
3、floor
:向下取整
返回 <= 该参数的最大整数

select floor(1.02);  #结果 1
select floor(9.8);  #结果 9
select floor(-9.9);  #结果 -10
5、truncate
:截断
只保留小数点指定的位数,不考虑四舍五入

select truncate(1.6999,1);  #结果 1.6
注意:截断只保留小数点后几位,此时不用管四舍五入

select truncate(2000,2);  #结果 2000
6、mod
:取余
mod(a,b) = a-a/b*b;

select mod(10,3);  #结果 1
select 10%3;  #结果 1

select mod(-10,3);  #结果 -1
select mod(-10,-3);  #结果 -1
select mod(10,-3);  #结果 1
被除数为正结果为正,被除数为负结果为负
三、日期函数
1、now
:返回当前系统日期+时间

select now();
2、curdate
:返回当前系统的日期,不包含时间

select curdate();
3、curtime
:返回当前系统的时间,不包含日期

select curtime();
4、返回指定部分的 年 月 日 小时 分钟 秒

select year(now());  #结果 返回当前时间的年份

select year('1996-5-3');  #结果 1996
注意:时间格式默认为 年-月-日,中间的分隔符可为 ‘.’ ‘-’ 两个可混用

select month(now());  #结果 返回当前时间的月份
注意:时间格式跟上同
select monthname(now());  #结果 返回当前时间的月份的英语名

select day(now());  #结果 返回当前时间的日,几号
注意:时间格式如上同
select dayname(now());  #结果 返回当前时间的星期,英文

select hour(now());  #结果 返回当前时间的小时数
时间格式:select hour('2000-5-6 13-53-59');  #结果 13
注意:分隔符 ‘.’ ‘-’ 可混用,年月日 和 时间 之间必需要有空格分隔开

select minute('2000-5-6 13-53-59');  #结果 53

select second('2000-5-6 13-53-59');  #结果 59
5.1、str_to_date
:将日期格式的字符转换成指定格式的日期
注意:必需合法的日期格式字符

select str_to_date('1998-3-2','%Y-%c-%d');  #结果 1998-03-02
注意:03是显示效果

5.2、date_format
:将日期转换为字符

select date_format(now(),'%y年%m月%d日');

select date_format('2019-8-9','%y年%m月%d日');  #结果 19年08月09日

附:日期格式

序号

格式符

功能

1

%Y

四位的年份

2

%y

两位的年份

3

%m

月份(01,02,12)

4

%c

月份(1,2,11,12)

5

%d

日(01,02,03…)

6

%H

小时(24小时制)

7

%h

小时(12小时制)

8

%i

分钟(00,01,02,…59)

9

%s

秒(00,01,…59)

四、其它函数
1、查询当前版本
select version();

2、查询当前使用库
select database();

3、查询当前用户
select user();
五、流程控制函数
1、if 函数: if else 的效果

select if(10>5,'大','小');  #结果:大
select if(10<5,'大','小');  #结果:小

select if(判断条件,执1,执2);
若判断条件成立,输出执1,不成立输出执2
2.1、case函数的使用一: switch case 效果

等值判断
case 要判断的字段或表达式
when 常量1 then 要显示的值1或 语句1;
when 常量2 then 要显示的值2或 语句2;
...
else 要显示的值n或语句n;
end
#注意:当then是要显示时,不加分号
可配合select做表达式也可单独做一条语句

2.2、case函数的使用二: 类似 多重if

区间判断
case
when 条件1 then 要显示的值1或 语句1;
when 条件2 then 要显示的值2或 语句2;
...
else 要显示的值n或 语句n;
end

分组函数

功能:用作统计使用,又称为聚合函数或统计函数或组函数

分类:
sum() 求和
avg() 平均值
max() 最大值
min() 最小值
count() 计算个数

#注意 
count() 计算非空的值的个数
sum() , avg() 一般用于处理数值型
max() , min() , count() 可以处理任何类型
以上五种类型都忽略 null 值(即null值不进行处理)


搭配 distinct 进行去重后操作
select sum(distinct TY);  #对TY去除重复值后再进行求和
其它四类也可一样操作