group by可以根据一个或者多个列值将数据进行分组。
在使用group by之后的select子句中的列名必须为分组列或者列函数。列函数可以对组进行处理,比如count、max等。
如果我们执行该sql命令:
select * from product_detail group by name;
该命令会报错,因为我们select选出所有列,但是group by中只有name列。
- 可以使用having筛选满足条件的组。
如果我们执行该sql命令:
select age from user group by age having age > 60;
该命令只会返回年龄大于60的组。
- where与group by可以一起使用
可以使用where除去不满足条件的数据行,然后对处理之后的数据再次进行分组。但是需要注意的是where语句必须在group by 之前执行。
注意,在上面我们提到select子句中的列必须出现在group by中,其实这种行为是数据库默认的。
执行sql命令:
select @@global.sql_mode;
我们可以看到输出结果为:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
其中,ONLY_FULL_GROUP_BY就是就会导致我们提到的现象。如果我们去掉该设置就可以在select中选择任意列了。
执行sql命令来去除该设置:
set @@global.sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
这时候关闭客户端,重新创建连接然后运行命令去看看结果吧。