mysql----group by、where以及聚合函数需要注意事项

一、group by产生的坑

一、假设有一张测试表test

mysql----group by、where以及聚合函数需要注意事项_第1张图片

 执行sql语句:select name from test group by name;通过分组过滤掉重复的name,

然后展先的字段也是name,这个没有问题的。

 

 二、注意坑

如果sql语句改为select * from test group by name;这个时候就有问题了。如果这个时候有一个中间表3,如下可以看到问题,也就是说,如果通过goup by进行分组过滤查询,查询字段又是全部,而分组字段却又只是一个,那么有重复数据的其他字段就会出现问题,由于mysql单元格里只能有一个数据,这个时候就会报错。

mysql----group by、where以及聚合函数需要注意事项_第2张图片

 三、解决方法

对于group by 进行去重,select后面跟着的查询字段,要么就是group by里的字段(select name from test group by name ),要么就是使用聚合函数(select name sum(number) from test group by name),(select name,sum(id) from test group by name,number,此结果如下图)

mysql----group by、where以及聚合函数需要注意事项_第3张图片

 二、where 注意事项

一、where 后面不能跟聚合函数

如果where后面跟了聚合函数,会出现Invalid use of group function的错误。如果想使用聚合函数进行过滤或统计之类的操作,要么是在select 后面进行,要么就在having后面进行。

二、where和having之间的区别

1、where是一个约束声明,在查询数据库的结果返回之前对数据库中的查询条件进行约束,即在结果返回之前起作用,且where后面不能使用“聚合函数”,因为where的执行顺序在聚合函数之前。

2、having是一个过滤声明,过滤是在查询数据库的结果返回之后进行过滤,即在结果返回之后起作用,且having后面可以使用“聚合函数”。注意:having是对查出来的结果进行过滤,那么对没有查出来的值就不能使用having。另外。having不是必须和group by一起使用的,两者没有捆绑关系

你可能感兴趣的:(MySQL,数据库,sql,java)