今天写sql的时候发现了一些小细节。
用count(1)统计符合特定条件的用户数量时,利用月份进行分组。当没有符合条件的用户时,count(1)会返回0。
但是下面的结果却不为0:

select count(1) num
from users
where Address='Shanghai'
and Id>10010
group by Month;


很有趣的是,结果是空记录。
在多次尝试后,我发现把group by去掉之后,count(1)才会返回0:

select count(1) num
from users
where Address='Shanghai'
and Id>10010;



这种现象,我认为是因为count在group by之后执行,但是由于筛选后的临时表纪录为空,group by产生的临时表不存在,所以统计出的结果是null而不是0。
值得一提的是,这种情况下使用IFNULL函数也没有效果,因为空记录并不等同于NULL。


这种情况其实在工作中有可能会出现,所以在进行分组统计时,最好还是处理一下。
这里我采用了嵌套子查询来规避:

select count(1) num
from (
    select month,name
    from users
    where Address='Shanghai'
    and Id>10010
    group by Month,Name) a;



这里我猜测是因为子查询自动生成了一个空临时表,因此count(1)才为0。

考虑到对空表、含有null的表使用group by及分组函数存在的问题,我也进行了尝试,以下是我的部分结果:

1. 对空表

  • 使用count(*)/count(1)/count(列名)时,返回 0 。若再加上分组(group by) ,对空表会返回 空表 (由于group by产生的临时表不存在)。
  • 使用sum/avg/max/min(1)或sum/avg/max/min(列名),返回 null ;若再加上分组(group by) ,对空表会返回 空表 (由于group by产生的临时表不存在)。
  • 在函数的返回值中,这一点会影响结果:若使用group by,count()返回null;不使用group by,则count()返回0。

第一张无group by,第二张有group by:

2. 对列a中均为null或全表均为null的表:

  • 使用count(a),无论有无group by,都返回 0
  • 使用count(1)/count(*),无论有无group by,都会返回 总行数
  • 使用sum/avg/max/min(a),无论有无group by,都会返回 null
  • 使用avg/max/min(1),无论有无group by,都会返回 括号中的数字
  • 使用sum(1),无论有无group by,都会返回( 行数*括号中的数字 )。

第一张无group by,第二张有group by:

3. 对列b存在多个null(不全为null)的表:

  • 使用count(b),返回 不为null的总行数 。当对列b使用group by时,null与非null会被区分开,返回结果中,null成为一个分组,count(b)等于 0 (不管其他列是否有值),其他不为null的count(b)等于 各自的行数
  • 使用count(1)/count(*),会返回总行数。当对列b使用group by时,null与非null会被区分开,返回结果中,null成为一个分组,count(1)/count(*)等于 列b中为null的行数 ,其他不为null的则会得出 各自的行数
  • 使用sum/avg/max/min(b),返回 不为null的数值总和/平均值/最大值/最小值 。当对列b使用group by时,null与非null会被区分开,返回结果中,null成为一个分组,sum/avg/max/min(b)等于 null (不管其他列是否有值),其他不为null的sum/avg/max/min(b)等于 相应的和/平均值/最大值/最小值

第一张无group by,第二张有group by:

用count(1)统计符合特定条件的用户数量时,利用月份进行分组。当没有符合条件的用户时,count(1)会返回0。但是得到的结果却不为0。考虑到对空表、含有null的表使用group by及分组函数存在的问题,我做出了多种尝试。 `empno` int(11) DEFAULT NULL , `ename` varchar(50) DEFAULT NULL , `job` varchar(50) DEFAULT NULL , `mgr` int(11) DEFAULT NULL , `hiredate` date DEFAULT NULL , `sal` decimal(7,2) DEFA
统计数据需要按省份 分组 ,这是大家经常遇到的 问题 。今天遇到一奇葩 问题 ,由于省份(province)字段数据不规范, 有的是省份名称,有的是 "" (空)  有的是 "未知"。这时 group by province 时就会出现未知的一组  空数据的一组  当然 前台是不能显示空省份的  如果把空省份都循环赋值为未知的话  前台显示未知省份 显得也不是那么和谐。     解决办法:
本文实例讲述了 mysql group _concat() 函数 用法。分享给大家供大家参考,具体如下: group _concat(),手册上说明:该 函数 返回带有来自一个组的连接的非 NULL 值的字符串结果。比较抽象,难以理解。 通俗点理解,其实是这样的: group _concat()会计算哪些行属于同一组,将属于同一组的列显示出来。要返回哪些列,由 函数 参数(就是字段名)决定。 分组 必须有个标准,就是根据 group by指定的列进行 分组 group _concat 函数 应该是在内部执行了 group by语句,这是我的猜测。 1.测试语句: SELECT group _concat(town) FROM `pl
最近工作上遇到一个 问题 ,就是按照某个字段 分组 但是需要将值为 null 和空字符串的分在一个组别里面并且 使用 一层 SQL 来实现,于是我就想在select 后面将字段为空的赋值空字符然后在 group by 结果不行,因为 group by语句执行顺序在select 前面,于是就有了这篇文章了,哈哈哈 一、错误示范 代码如下(示例): select IF NULL (name,'') as name,age from t_user group
CREATE TABLE IF NOT EXISTS A(id INT PRIMARY KEY AUTO_INCREMENT ,NAME VARCHAR(10)) ; CREATE TABLE IF NOT EXISTS B(id INT PRIMARY KEY AUTO_INCREMENT ,NAME VARCHAR(10) ,aid INT NOT NULL ) ; INSERT INTO A
Null 值属于任何类型,它和空字符不一样,空字符它是属于varchar2的数据类型,但是 null 可以是任何数据类型,因此在处理空值的时候特别要小心。示例:在oracle中的模版示例中有emp ,我们知道有一列deptno列,但是其中没有任何一个员工,因此对它进行 group by 的时候,如果不加 group by 的时候, 它会返回一行数据,但是如果加了结果就不是预想的那样了。来做一个演示:
MySQL 中,可以 使用 DATE_FORMAT 函数 将时间按照指定格式进行格式化,然后再 使用 GROUP BY语句将结果按照格式化后的时间进行 分组 查询。 例如,如果想要按照年份和月份进行 分组 查询,可以 使用 如下语句: SELECT DATE_FORMAT(date_column, '%Y-%m') AS formatted_date, COUNT(*) AS count FROM table_name GROUP BY formatted_date; 其中,`date_column`是存储时间的列名,`table_name`是 名,`'%Y-%m'` 示将时间格式化为年份-月份的形式。`formatted_date`是格式化后的时间,`COUNT(*)`是统计每个时间段的数量。 你可以根据自己的需求修改DATE_FORMAT 函数 中的格式字符串,例如,`'%Y'` 示只按照年份 分组 查询。