一、单行函数
1.1 字符函数
- length(str):统计字符串的字节数(取决于编码方式,utf8汉字3字节,gbk汉字2字节)
- concat(str1, str2):拼接字符
- substr/substring(str, n1 [,n2]):切割字符,n1起始位置(mysql下标从1开始),n2可选,表示切割长度
- instr(str1, str2):返回str2在str1中首次出现的位置;如果没有找到,则返回0。不区分大小写。
- trim(str [, substr]):取出字符串前后的substr字符串,默认为空格
- upper(str):字母变大写
- lower(str):字母变小写
- lpad(str1,length,str2)。其中str1是第一个字符串,length是结果字符串的长度,str2是一个填充字符串。如果str1的长度没有length那么长,则使用str2填充;如果str1的长度大于length,则截断。
- rpad(str1, length, str2):参考lpad
- replace(object,search,replace):把object对象中出现的的search全部替换成replace。
1.2 数学函数
- round(num, 2):四舍五入,保留两位小数
- ceil(num):向上取整
- floor(num):向下取整
- truncate(num, 2):从小数点后两位直接截断,比如truncate(3.1415926, 3) = 3.141
- mod(num, 2):求余数 num % 2
1.3 日期函数
- now():当前系统时间,1997-06-03 19:23:12
- curdate():当前系统时间的日期,1997-06-03
- curtime():当前系统时间的时间,19:23:12
- year():年份,1997
- month():月,6
- monthname():英文形式,June
- day():日, 3
- hour():小时, 19
- minute():分钟, 23
- second():秒, 12
- str_to_date(“1997-06-03 19:23:12”, "%Y-%m-%d %H:%i:%s):通过后面的模式将前面的字符串进行转换成date格式
- date_format(“1997/6/3”, “%Y年%m月%d日”):将日期转为字符,1997年6月3日
- datediff(date1, date2):
1.4 控制函数
-
if:类似于三元运算符
-
case:
第一种情况:类似于switch…case…
第二种情况:类似于多重if
1.5 其他函数
- version:版本
- database:当前数据库
- user:当前用户
二、分组函数
功能:用作统计使用,又称为聚合函数或统计函数或组函数。
分类:sum,avg,max,min,count
2.1 简单使用
select sum(salary) from employees;
select avg(salary) from employees;
select max(salary) from employees;
select min(salary) from employees;
select count(salary) from employees;
select sum(salary) 和, avg(salary) 平均值, max(salary) 最大值, min(salary) 最小值, count(salary) 个数
from employees;
# 对平均值四舍五入保留两位小数
select sum(salary) 和, round(avg(salary), 2) 平均值, max(salary) 最大值, min(salary) 最小值, count(salary) 个数
from employees;
2.2 参数支持哪些类型
- sum、avg一般用于处理数值型(不报错,但没意义)
- max,min,count可以处理任何类型
2.3 是否忽略null值
sum,avg,max,min,count都忽略null值
2.4 和distinct搭配
select sum(distinct salary), sum(salary) from employees;
select count(distinct salary), count(salary) from employees;
2.5 count函数的详细介绍
select count(salary) from employees;
# 统计行数
select count(*) from employees; # 只要有一列不为null,行数便+1,不可能一行所有列同时为null(因为也不算数)
select count(1) from employees; # 原理是添加一列,该列所有行填充1,统计1的个数,也可以使用其他常量代替
效率:
- MyISAM:count(*)效率高
- InnoDB:count(*)和count(1)差不多,比count(字段名)要高一些
2.6 和分组函数一同查询的字段有限制
和分组函数一同查询的字段要求是group by后的字段