mysql中的group by

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';

这时候关闭客户端,重新创建连接然后运行命令去看看结果吧。

猜你喜欢

转载自blog.csdn.net/zhaoruda/article/details/80145016