zoukankan      html  css  js  c++  java
  • GROUP BY和HAVING 以及mysql中常用的日期函数

    一.mysql中的GROUP BY和HAVING
    GROUP BY常见的是和聚合函数(SUM,MIN,MAX,COUNT)搭配使用.

    比如:
    SELECT category,SUM(money) AS `total` FROM user_money GROUP BY category;
    按类别分组统计user_money表每个类别总计有多少money

    现在如果增加个条件,需要统计每个类别中支出的money总量,比如rule=1为支出,则改写语句为
    SELECT category,SUM(money) AS `total` FROM user_money WHERE rule=1 GROUP BY category;

    如果需要统计每个类别支出money总量,并且需要过滤出支出money总量大于500的分组
    SELECT category,SUM(money) AS `total` FROM user_money WHERE rule=1 GROUP BY category HAVING `total`>500;

    1.WHERE用于对分组前的数据过滤,HAVING用于对分组后的数据进行过滤.
    2.使用GROUP BY两个注意点
    (1)SELECT中出现的字段,要么是聚合函数,要么在GROUP BY中出现;否则sql语句可以执行,但该字段只是取了分组记录中的第一个记录的该字段值(该值可以使用ORDER BY 改变),没任何意义
    (2)使用WHERE过滤分组前的数据,然后使用GROUP BY分组,再使用HAVING过滤分组后的数据;两者后面条件字段都不能出现聚合函数计算后的别名字段
    (3)ORDER BY 和 GROUP BY顺序问题
    SELECT category,SUM(money) AS `total` FROM user_money ORDER BY id DESC GROUP BY category HAVING `total`>500;
    ORDER BY 放在GROUP BY的前面,表示对未分组的结果进行排序(排序字段不能是聚合函数计算后的别名字段)一般没用,反正你最终的目的是聚合计算的
    SELECT category,SUM(money) AS `total` FROM user_money DESC GROUP BY category HAVING `total`>500 ORDER BY t DESC;
    GROUP BY放在ORDER BY的前面,别是对分组后的结果进行排序,这个时候排序字段一把是聚合函数计算后的别名字段或者是GROUP BY的分组字段.
    (4)GROUP BY中的多字段分组
    先依据第一字段分组,然后再依据第二字段对上一次分组的结果再次进行分组


    二.mysql的有用的日期函数
    SELECT NOW() -> 2017-05-20 20:36:49
    SELECT CURDATE() -> 2017-05-20
    SELECT CURDATE() -> 2017-05-20
    SELECT CURRENT_TIME() -> 20:38:37
    SELECT UNIX_TIMESTAMP(NOW()) ->1495283945 将日期转为时间戳

  • 相关阅读:
    jdk和jre有什么区别?
    Apache的作用及意义
    博客园新成员的第一天
    重构改善既有代码的设计--简化条件表达式
    SourceMonitor: 代码重构的小工具,大用场
    使用Eclipse中提供的Refactor(重构)工具
    极大提高Web开发效率的8个工具和建议(含教程)
    Hbase shell命令
    Java多线程-新特性-有返回值的线程
    Java多线程-新特征-条件变量
  • 原文地址:https://www.cnblogs.com/itfenqing/p/6883229.html
Copyright © 2011-2022 走看看