MySql 中聚合函数增加条件表达式的方法

Mysql 与聚合函数在一起时候where条件和having条件的过滤时机

where 在聚合之前过滤

当一个查询包含了聚合函数及where条件,像这样的情况
select max(cid) from t where t.id<999
这时候会先进行过滤,然后再聚合。先过滤出ID《999的记录,再查找最大的cid返回。

having 在聚合之后过滤

having在分组的时候会使用,对分组结果进行过滤,通常里面包含聚合函数。

SELECT ip,MAX(id) FROM app
GROUP BY ip
HAVING MAX(id)>=5 

先分组,再聚合,然后过滤聚合结果大于等于5的结果集

二者的区别:

where是先执行,然后再执行聚合函数。having是在聚合函数执行完之后再执行。

下面是补充

有个需求,某张表,有个状态字段(1:成功,2:失败,类似这样的),现要用日期分组统计不同状态下的数量

先写了个子查询

select aa.logDate,aa.totalLogs
 ,(select count(1) from dxp.dxp_handlermodel where aa.logDate=DATE_FORMAT( startTime, '%Y-%m-%d') and executeStatus=1) pendingLogs
 ,(select count(1) from dxp.dxp_handlermodel where aa.logDate=DATE_FORMAT( startTime, '%Y-%m-%d') and executeStatus=2) successLogs
 ,(select count(1) from dxp.dxp_handlermodel where aa.logDate=DATE_FORMAT( startTime, '%Y-%m-%d') and executeStatus=3) errorLogs
 ,(select count(1) from dxp.dxp_handlermodel where aa.logDate=DATE_FORMAT( startTime, '%Y-%m-%d') and executeStatus=4) callbackErrorLogs
from
(
 select
 DATE_FORMAT( a.startTime, '%Y-%m-%d') logDate,
 count(1) totalLogs
 from dxp.dxp_handlermodel a
 group by DATE_FORMAT( a.startTime, '%Y-%m-%d')
) aa

执行相当慢,想到count中能不能加条件,找了一下,如下:

select
DATE_FORMAT( startTime, '%Y-%m-%d') logDate,
 count(1) totalLogs,
 count(if(executeStatus=1,true,null)) pendingLogs,
 count(if(executeStatus=2,true,null)) successLogs,
 count(if(executeStatus=3,true,null)) errorLogs,
 count(if(executeStatus=4,true,null)) callbackErrorLogs
from dxp.dxp_handlermodel
group by DATE_FORMAT( startTime, '%Y-%m-%d')

简明易懂,且执行效率非常高

其它的聚合函数也可以用,如SUM等其他聚合函数

实战示例:

select count(if(create_date < '2017-01-01' and host_profile_id = '9294d2bf-f457-4fe5-9a36-e5f832310dc2',true,null)) from profile_visit_log
-- 等同于
select count(if(create_date < '2017-01-01',true,null)) count from profile_visit_log where host_profile_id = '9294d2bf-f457-4fe5-9a36-e5f832310dc2'

好了这篇文章就介绍到这,希望大家以后多多支持我们。

(0)

相关推荐

  • 利用MySQL统计一列中不同值的数量方法示例

    前言 本文实现的这个需求其实十分普遍,举例来说,我们存在一个用户来源表,用来标记用户从哪个渠道注册进来.表结构如下所示- 其中 origin 是用户来源,其中的值有 iPhone .Android .Web 三种,现在需要分别统计由这三种渠道注册的用户数量. 解决方案1 SELECT count(*) FROM user_operation_log WHERE origin = 'iPhone'; SELECT count(*) FROM user_operation_log WHERE ori

  • MySQL常用聚合函数详解

    一.AVG AVG(col) 返回指定列的平均值 二.COUNT COUNT(col) 返回指定列中非NULL值的个数 三.MIN/MAX MIN(col):返回指定列的最小值 MAX(col):返回指定列的最大值 四.SUM SUM(col) 返回指定列的所有值之和 五.GROUP_CONCAT GROUP_CONCAT([DISTINCT] expr [,expr ...]              [ORDER BY {unsigned_integer | col_name | expr}

  • php+mysql开源XNA 聚合程序发布 下载

    PHP+MYSQL (php5 +mysql 4.1) 的一个简单的开源XNA聚合,效果如:http://xna.spvrk.com 一个简单的聚合程序,用phpmyadmin 导入cms_xna.sql,修改config.inc.php中的数据库地址即可使用,后台为/admin,因时间关系,暂时没写用户名和密码验证,大家可免费使用本程序,也可在本程序的基础上二次开发,但不得用于任何商业用途,不提供技术支持,但有好的新版本也可回馈给我,本程序使用通用公共授权GPL3,想做成一个开源的项目,不知有

  • Mysql 相邻两行记录某列的差值方法

    表结构: 数据: 需求: 按照company_id不同分组,然后分别求出相同company_id相邻记录touch_time的差值 SQL: select r1.company_id, r1.touch_time, r2.touch_time, r1.touch_time - r2.touch_time from (select (@rownum := @rownum + 1) as rownum, info.company_id, info.touch_time from sys_touch_

  • Mysql无法选取非聚合列的解决方法

    1. 前言 最近升级博客,给文章页面底部增加了两个按钮,可以直接跳转到上一篇和下一篇. 如下图所示: 实现这个功能的难点在于:数据库怎么选取出一条记录的前后两条相邻的记录? 2. 数据库设计 关于我文章数据库的设计如下图所示: 可以看到,每条记录的身份是索引Id.因为之前有很多文章记录被删除了,所以,Id并不是连续的. 如果当前文章的索引值是33,那么可以通过以下命令来得到前后相邻的 2 篇文章: select * from passage where id in (select case wh

  • MySQL中聚合函数count的使用和性能优化技巧

    本文的环境是Windows 10,MySQL版本是5.7.12-log 一. 基本使用 count的基本作用是有两个: 统计某个列的数据的数量: 统计结果集的行数: 用来获取满足条件的数据的数量.但是其中有一些与使用中印象不同的情况,比如当count作用一列.多列.以及使用*来表达整行产生的效果是不同的. 示例表如下: CREATE TABLE `NewTable` ( `id` int(11) NULL DEFAULT NULL , `name` varchar(30) NULL DEFAUL

  • MySql 中聚合函数增加条件表达式的方法

    Mysql 与聚合函数在一起时候where条件和having条件的过滤时机 where 在聚合之前过滤 当一个查询包含了聚合函数及where条件,像这样的情况 select max(cid) from t where t.id<999 这时候会先进行过滤,然后再聚合.先过滤出ID<999的记录,再查找最大的cid返回. having 在聚合之后过滤 having在分组的时候会使用,对分组结果进行过滤,通常里面包含聚合函数. SELECT ip,MAX(id) FROM app GROUP BY

  • 深入了解MySQL中聚合函数的使用

    目录 什么是聚合函数 SUM 函数 MAX 函数 MIN 函数 AVG 函数 COUNT 函数 聚合函数综合小练习 聚合函数综合练习 -1 聚合函数综合练习 -2 今天的章节我们将要来学习一下 “聚合函数” :首先我们需要学习聚合函数对数据进行统计分析,比如说求最大值.最小值.平均值之类的场景.但是单纯的使用聚合函数,只能做全表范围的统计分析.如果想要把记录分组分别统计,需要使用 “GROUP BY” 和 “HAVING” 这样的分组子句了.关于分组查询的应用,将在下一章节为大家进行讲解.当前章

  • 浅谈mysql中concat函数,mysql在字段前/后增加字符串

    MySQL中concat函数 使用方法: CONCAT(str1,str2,-) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL. 注意: 如果所有参数均为非二进制字符串,则结果为非二进制字符串. 如果自变量中含有任一二进制字符串,则结果为一个二进制字符串. 一个数字参数被转化为与之相等的二进制字符串格式:若要避免这种情况,可使用显式类型 cast, 例如: SELECT CONCAT(CAST(int_col AS CHAR), char_col) MySQ

  • MySQL中sum函数使用的实例教程

    文章简介 今天分享一下MySQL中的sum函数使用.该函数已经成为大家操作MySQL数据库中时常用到的一个函数,这个函数统计满足条件行中指定列的和,想必肯定大家都知道了,本身就没什么讲头了,这篇文章主要是通过几个小案例深入了解一下该函数,以及在做MySQL查询时如何使用sum函数做优化. 语法分析 SUM([DISTINCT] expr) [over_clause] Returns the sum of expr. If the return set has no rows, SUM() ret

  • Mysql中使用count加条件统计的实现示例

    目录 前言 测试环境 准备工作 条件统计 总结 前言 最近发现在处理Mysql问题时,count()函数频繁上镜,常常出现在分组统计的情景下,但是有时候并不是使用group by分好组就可以直接统计了,比如说一个常见的需求,统计每个班级男生所占的比例,这种情况一般会按照班级分组,但是分组内不但要统计班级的人数,还要统计男生的人数,也就是说统计是有条件的,之前确实没有考虑过怎样实心,后来查询了资料,总结在这里,方便日后查找使用. Mysql中count()函数的一般用法是统计字段非空的记录数,所以

  • MySQL中时间函数操作大全

    目录 1. 获取系统当前时间 1.1. 获取 YYYY-MM-DD HH:mm:ss 1.2. 获取 YYYY-MM-DD 1.3. 获取 HH:mm:ss 2. 时间加减间隔函数 2.1. DATETIME 类型的加减 2.2. DATE 类型的加减 3. 两个时间的相减 3.1. DATE 类型相减 3.2. TIMESTAMP 类型 附:时间差 datediff() 总结 1. 获取系统当前时间 MySQL 版本为 5.7,详细的时间函数可以参考 MySQL 官方文档 在这里 1.1. 获

  • MongoDB 中聚合统计计算--$SUM表达式

    我们一般通过表达式$sum来计算总和.因为MongoDB的文档有数组字段,所以可以简单的将计算总和分成两种: 1,统计符合条件的所有文档的某个字段的总和: 2,统计每个文档的数组字段里面的各个数据值的和.这两种情况都可以通过$sum表达式来完成. 以上两种情况的聚合统计,分别对应与聚合框架中的 $group 操作步骤和 $project 操作步骤. 1.$group 直接看例子吧. Case 1 测试集合mycol中的数据如下: { title: 'MongoDB Overview', desc

  • mysql中left join设置条件在on与where时的用法区别分析

    本文实例讲述了mysql中left join设置条件在on与where时的用法区别.分享给大家供大家参考,具体如下: 一.首先我们准备两张表来进行测试. CREATE TABLE `a` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', `name` varchar(32) DEFAULT '' COMMENT '名称', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET

  • MySQL使用聚合函数进行单表查询

    聚合函数 作用于一组数据,对那组数据返回一个值 count :统计结果记录多少条数, max:统计最大值 min:统计最小值 sum:计算求和 avg: 计算平均值 注意,分组函数 group by.如果要对 分组后 的数据进行筛选,那么必须使用 having 关键字,条件写在 having 后面: where:先过滤已有的数据,在分组,在聚合函数计算: having:过滤分组之后的数据.插入我们需要练习的表city 表 CREATE TABLE `city` ( `id` INT AUTO_I

随机推荐