美文网首页
MySQL图表数据统计常用方法

MySQL图表数据统计常用方法

作者: Lutils | 来源:发表于2019-03-22 16:19 被阅读0次

    常用时间函数

    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图表数据统计常用方法

          本文链接:https://www.haomeiwen.com/subject/zglrvqtx.html