今天写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'`
表
示只按照年份
分组
查询。