新建了一张测试的表,用来测试
CREATE TABLE `my_order` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`status` varchar(255) NOT NULL COMMENT '状态',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of my_order
-- ----------------------------
INSERT INTO `my_order` VALUES ('1', '任务1', '已完成');
INSERT INTO `my_order` VALUES ('2', '任务2', '已完成');
INSERT INTO `my_order` VALUES ('3', '任务3', '已完成');
INSERT INTO `my_order` VALUES ('4', '任务4', '未完成');
INSERT INTO `my_order` VALUES ('5', '任务5', '未完成');
INSERT INTO `my_order` VALUES ('6', '任务6', '未完成');
INSERT INTO `my_order` VALUES ('7', '任务7', '已取消');
INSERT INTO `my_order` VALUES ('8', '任务8', '已取消');
1、if相关判断
ifnull(expr1,expr1):常用来替换Null值,如果expr1的值为null,则取expr2的值,expr2可以是列名,也可以是一个具体的值
if(expr1,expr2,expr3):这个跟java中的三元表达式差不多,如果expr1条件为true,那么返回expr2,否则返回expr3
例如执行: select id,if(status='已完成',true,false) from my_order
case():流程控制的函数
第一种用法:
CASE expression WHEN value1 THEN returnvalue1 WHEN value2 THEN returnvalue2 WHEN value3 THEN returnvalue3 …… ELSE defaultreturnvalue END
例如执行:
select id,
(
case status
when '已完成' then
2
when '已取消' then
1
when '未完成' then
0
else
'NaN'
end
)
from my_order
结果为
第二张用法:
CASE WHEN condition1 THEN returnvalue1 WHEN condition 2 THEN returnvalue2 WHEN condition 3 THEN returnvalue3 …… ELSE defaultreturnvalue END
例如执行:
select id,
(
case
when status='已完成' then
2
when status='已取消' then
1
when status='未完成' then
0
else
'NaN'
end
)
from my_order
结果为
2.聚合函数
常用的聚合函数有:
avg(col) 计算一组值或表达式的平均值。
instr(col) 返回子字符串在字符串中第一次出现的位置。
sum() 计算一组值或表达式的总和。
min() 在一组数据中找到最小值
max() 在一组数据中找到最大值
count() 计算表中的行数
这里附近一个关于count(),count(1)和count(*)执行效率的区别: http://eeeewwwqq.iteye.com/blog/1972576
3.日期函数
now()函数:获取当前的时间,等同于CURRENT_TIMESTAMP()
执行 select now() ,CURRENT_TIMESTAMP()
date(expr)函数:将日期转换成年月日格式的
执行 select date(now())
time(expr)函数:将日期转换成时分秒格式的
执行select time(now())
当然 年月日相关的就跟上面的两个一样了
执行select now(),year(now()),MONTH(now()),DAY(now()), HOUR(now()),minute(now()),second(now())
date_format(date,format), time_format(time,format):将日期格式转换成字符串的格式
执行select now(),date_format(NOW(), '%Y%m%d%H%i%s')
str_to_date(str, format): 将各种各样的字符串格式转换成日期
例如: select str_to_date('08/09/2018', '%m/%d/%Y'),str_to_date('08/09/08' , '%m/%d/%y'),
str_to_date('08.09.2008', '%m.%d.%Y'),str_to_date('08:15:30', '%h:%i:%s')
执行结果为
date_add():增加一个时间间隔
例如: select now(), date_add(now(),INTERVAL 1 day)
执行结果为
上面sql语句的day可以是 year,month,week,hour,minute,second等。
date_sub():减去一个时间间隔,用法就和date_add()相同了
datediff(date1,date2): 两个日期相减,date1减去date2,返回的是天数
timediff(time1,time2): 两个时间相减,time1减去time2,得到时间戳HH:mm:ss格式的
例如:select DATEDIFF(now(),'2018-05-01'),TIMEDIFF(time(now()),'00:00:00')
执行结果
timestamp(expr) :将日期转换成时间戳
timestamp(expr,expr2):将日期相加再得到时间戳
timestampadd(unit,interval,datetime_expr):unit可以是year,month,加上指定的时间间隔
timestampdiff(unit,datetime_expr1,datetime_expr2):日期expr2减去expr1得到的差转换成unit,unit可以是year,month等
例如:
select TIMESTAMP(now()),TIMESTAMP(now(),'08:09:10'),TIMESTAMPADD(day,1,now()),TIMESTAMPDIFF(year,now(),'2017-01-02 01:01:01')
执行结果为:
4、field()函数
field()函数一般用于order by 子句中,格式是 FIELD(str,str1,str2,str3,...),str是要排序的列,str1,str2...是str列中存在的值。
意思就是: 字段str按照字符串str1,str2,str3,的顺序返回查询到的结果集。如果表中str字段值不存在于str1,str2,str3,中的记录,放在结果集最前面返回。
如我的正常查询my_order表的结果如下
如果用field函数,执行 select * from my_order order by FIELD(status,'已完成','已取消')
field函数的字段里不包含‘未完成’,‘未完成’的就排在前面了,而存在的字段将会按声明的顺序进行排序。
5、coalesce(col,str)
这个函数的用于查询结果,如果col这个列没有值,则用str字符串来替代这个值。
如:select COALESCE(status,'总数') ,count(*) ,sum(id) from my_order GROUP BY STATUS with ROLLUP
查询结果为: