MySQL图表数据统计常用方法

常用时间函数

NOW()当前时间、CURDATE()当前日期、CURTIME()当前时间

SELECT NOW(),CURDATE(),CURTIME();
>2019-03-22 10:20:13 
>2019-03-22
>10:20:13

ROUND() 四舍五入
FROM_UNIXTIME() 将时间戳格式化(10位时间戳,精确到秒)

若数据库存的时间戳为13位(精确到毫秒),因MySQL只能转10位,则进行转换
SELECT FROM_UNIXTIME(ROUND(1552665572000/1000));
>2019-03-15 23:59:32

DATE_FORMAT() 格式化时间

SELECT DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s');
>2019-03-22 09:58:50

DATE_SUB() 日期减去指定的时间间隔 (DATE_ADD()同理)

DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(时间字段名) 近7天
type常用参数:DAY、MONTH、YEAR、HOUR

常用判空函数

IFNULL(fieldA,fieldB)
当字段fieldA是NULL时取fieldB,不是NULL时取fieldA的值
COALESCE (exp,value1,value2……,valuen)
exp为待检测的表达式,返回包括exp在内的所有参数中的第一个非空表达式

SELECT IFNULL(b.count,0),COALESCE(c.sum,0) FROM ...
常用与于统计总数时对null值赋0的作用

MySQL常见JOIN语法

SELECT ... FROM table1 xxx JOIN table2 ON ...

INNER JOIN(内连接):取得两个表中存在连接匹配关系的记录。

inner join.png

LEFT JOIN(左连接):取得左表(table1)完全记录,即是右表(table2)并无对应匹配记录。
left join.png

RIGHT JOIN(右连接):与 LEFT JOIN 相反,取得右表(table2)完全记录,即是左表(table1)并无匹配对应记录。
right join.png

注:MySQL不支持FULL JOIN,不过可以通过UNION 关键字来合并 LEFT JOIN 与 RIGHT JOIN来模拟FULL JOIN

UNION

SELECT ... FROM ... UNION SELECT ... FROM ...
对结果集取并集操作,不包括重复行,同时进行默认规则的排序
去重且排序

UNION ALL

SELECT  FROM ... UNION ALL SELECT ... FROM ...
对结果集取并集操作,包括重复行,不进行排序
不去重不排序

折线图统计一段时间没有数据补0的情况

构建一个虚拟的最近日期记录,如:
统计最近三天

SELECT CURDATE() AS time
UNION ALL
SELECT DATE_SUB(CURDATE(), interval 1 DAY) AS time
UNION ALL
SELECT DATE_SUB(CURDATE(), interval 2 DAY) AS time

统计最近三月

SELECT DATE_FORMAT(CURDATE(), '%Y-%m') AS time
UNION ALL
SELECT DATE_FORMAT(DATE_SUB(CURDATE(), interval 1 MONTH), '%Y-%m') AS time
UNION ALL
SELECT DATE_FORMAT(DATE_SUB(CURDATE(), interval 2 MONTH), '%Y-%m') AS time

统计最近三小时

SELECT DATE_FORMAT(NOW(), '%m-%d %H') as time 
UNION ALL 
SELECT DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 HOUR), '%m-%d %H') AS time
UNION ALL 
SELECT DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 2 HOUR), '%m-%d %H') AS time

或利用mysql自带数据库生成数据,如生成最近7天日期列表

SELECT @s :=@s + 1 as `index`, DATE(DATE_SUB(CURRENT_DATE, INTERVAL @s DAY)) AS `date`
FROM mysql.help_topic,(SELECT @s := -1) temp
WHERE @s < 6
ORDER BY `date` DESC

最后将以上数据与业务数据取左连接LEFT JOIN即可。

你可能感兴趣的:(MySQL图表数据统计常用方法)