关于mysql 联表使用count的一个问题
2017-05-03 13:55
513 查看
今天遇到了一个sql问题,及理解过程记录下
select a.id as id,
count(b.id)
from A a left join B b on a.id = b.aid
A表可以理解为班级表
B表为学生表,现在用以上语句试图求出每个班级下多少个学生
这个语句在oracle中,是有问题的,会直接报错,因为oracle要求非聚合函数的字段都必须进行分组
但是在mysql中不一样,所以以下分析是针对mysql的
这个语句执行出来貌似mysql自动完成了分组,其实是有细微差别的
当A表有数据时,则很正常
但是当A表为空数据时,执行以上语句,得到以下结果
null,0
从这个结果上看,和分组之后的结果就不一样了,增加分组
select a.id as id,
count(b.id)
from A a left join B b on a.id = b.aid
group by a.id
得到的结果是无记录
分析如下:
其实两个表的关联,可以理解为,两个表的所有列合并在一起,所有数据根据连接条件进行笛卡尔积之后得到的一个大的临时表,之后的所有过滤或其它函数之类的,就针对这个大的临时表进行操作
前者的写法,等同于
select a.id as id,
count(*)
from A a left join B b on a.id = b.aid
其联合后的临时表,其实是一个空表
那么使用count函数后,数据库会生成一个除了count(*)有值,其它字段都为null的结果集,以显示count(*) 的计算结果,所以前者就得到了null,0这样的结果集
而使用分组函数之后,分组函数的特点是,会忽略null值,从而得到正确结果
结论:
为了防止此问题的出现,在写sql时一定要规范,使用了聚合函数的查询,其它字段必须增加分组函数。
select a.id as id,
count(b.id)
from A a left join B b on a.id = b.aid
A表可以理解为班级表
B表为学生表,现在用以上语句试图求出每个班级下多少个学生
这个语句在oracle中,是有问题的,会直接报错,因为oracle要求非聚合函数的字段都必须进行分组
但是在mysql中不一样,所以以下分析是针对mysql的
这个语句执行出来貌似mysql自动完成了分组,其实是有细微差别的
当A表有数据时,则很正常
但是当A表为空数据时,执行以上语句,得到以下结果
null,0
从这个结果上看,和分组之后的结果就不一样了,增加分组
select a.id as id,
count(b.id)
from A a left join B b on a.id = b.aid
group by a.id
得到的结果是无记录
分析如下:
其实两个表的关联,可以理解为,两个表的所有列合并在一起,所有数据根据连接条件进行笛卡尔积之后得到的一个大的临时表,之后的所有过滤或其它函数之类的,就针对这个大的临时表进行操作
前者的写法,等同于
select a.id as id,
count(*)
from A a left join B b on a.id = b.aid
其联合后的临时表,其实是一个空表
那么使用count函数后,数据库会生成一个除了count(*)有值,其它字段都为null的结果集,以显示count(*) 的计算结果,所以前者就得到了null,0这样的结果集
而使用分组函数之后,分组函数的特点是,会忽略null值,从而得到正确结果
结论:
为了防止此问题的出现,在写sql时一定要规范,使用了聚合函数的查询,其它字段必须增加分组函数。
相关文章推荐
- 关于一个MYSQL语法(在查询中使用count)的兼容性问题
- 关于mysql使用索引的一个问题
- 浅析一个MYSQL语法(在查询中使用count)的兼容性问题
- 浅析一个MYSQL语法(在查询中使用count)的兼容性问题
- C#写的计数器控件 - 一个关于相对路径使用的问题
- 关于在MySQL 、 VC、 JSP 中使用UTF-8解决中文生僻字乱码的问题
- 谈一个现实问题,关于软件开发使用中给用户照成的损失谁来赔偿谁来负责的问题,您怎么看?
- 关于不需用使用top的地方,而必须使用的一个小问题
- 一个C++关于类使用的问题!
- VC中一个关于宏的使用问题,字符串之间转换,宽字符与普通字符
- 关于使用datagrid出现的CurrentPageIndex 值.它必须大于等于 0 且小于 PageCount!的问题
- 关于Mysql 外键使用的问题
- 一个关于Tsession的使用问题(摘录)
- 关于C++Builder 2007使用dbexpress + mysql的一些问题
- VC中一个关于宏的使用问题
- 在Spring中使用Mysql的一个小问题
- 请教一个在使用xtree过程中关于htc组件编写的问题
- 解决了一个关于mysql登陆的问题.
- 关于ASP.NET“操作必须使用一个可更新的查询”问题的解决方法
- ASP.Net下如何解决关于Access数据库“操作必须使用一个可更新的查询”问题