相关文章推荐
博学的双杠  ·  成都石室中学怎么样·  3 小时前    · 
温暖的煎饼  ·  打印PDF 无法指定到 ...·  10 月前    · 
不敢表白的钱包  ·  Clustering Algorithms ...·  1 年前    · 
从容的绿豆  ·  Initialize EGL for ...·  1 年前    · 
烦恼的黑框眼镜  ·  使用 JavaScript ...·  1 年前    · 

笔记,非教程;
最近做的需求,需要用到 group by ,刚好发现自己有点陌生,所以做个笔记;
看到网上资料说:

# 这种写法会报错,但是我在实践中发现不会报错;所以简单研究了
# MySQL如果开启了严格模式(sql_model=ONLY_FULL_GROUP_BY)才会报错
select * ... group by ...语句

group by

分组函数一般都会和group by联合使用!这也是为什么它被称为分组函数的原因。

任何一个分组函数(count sum avg max min)都是在group by语句执行结束之后才会执行的!

任何一个分组函数(count sum avg max min)都是在group by语句执行结束之后才会执行的!

任何一个分组函数(count sum avg max min)都是在group by语句执行结束之后才会执行的!

当一条sql语句没有group by,整张表的数据会自成一组。

下列图表,假设我们对name进行分组,分组后可以想象中得到虚拟表3.
在这里插入图片描述

如果MySQL处于严格模式(sql_mode被设置为ONLY_FULL_GROUP_BY),
这时,如果SQL写成select * from t group by name,就会报错,原因就是因为除了name之前,其他列的数据都不是唯一的,在严格模式会报错。

不过,在严格模式(ONLY_FULL_GROUP_BY)下,依然是想获取聚合列:

SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name;

原理就是从分组中,随意获取一个数据,前提也就是你不关心组数据中的不同情况。

  • 方法二:如果GROUP BY是主键或者 unique NOT NULL 时是可以查询非聚合的列的,原因是此时分组的key是主键,则每一个分组只有一条数据,因此是可以进行查询非聚合的列的。
  • 方法三:关闭严格模式
    查看当前sql_model:

查看当前sql_model

SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;

在非严格模式下,使用group by后,可以在select 非聚合列(也就是没有出现group by后面的字段),这是获取的非聚合列,是自然顺序的第一条;
在严格模式下,使用group by 后,不可以select 非聚合列,解决方法有三种:

  • any_value(字段名)
  • group by 字段是主键或者非空唯一键
  • 关闭严格模式

这个是通俗易懂类型:
Group by分组详解

MySQL中的Group By是否允许SELECT非聚合列的总结

【MySQL】十一、分组函数(group by,having),多字段分组查询

`sno` varchar(20) NOT NULL, `sname` varchar(20) DEFAULT NULL, `ssex` varchar(20) DEFAULT NULL, `sage` int(11) DEFAULT NULL, `sdept` varchar(20) DEFA...
今天被问到了一个问题 在MYSQL中使用GROUP BY分组时,我们可以select 多个非聚合字段,但是有些字段可能不在GROUP BY中,这样的SQL查询在SQL SERVER、ORACLE中是不合理的,且会报错,但mysql是可以通过,MYSQL的这种特异性,有时查询出来的结果并不是我们需要的。 下面我们来做一个实验 数据表如下: id   name  tel 1    a    ...
本文导读:在MYSQL中使用GROUP BY分组时,我们可以select 多个非聚合字段,但是这些字段不在GROUP BY中,这样的SQL查询在SQL SERVER、ORACLE中是不合理的,且会报错,MYSQL的这种特异性,有时查询出来的结果并不是我们需要的,那么,我们在使用时应该注意哪些呢? 一、下列语句在MySql中是合规的 select count(1),task_type...
如user_info表中有数据如下: 进行以下查询:select max(user_id),user_id,id,grade from user_info group by grade 应会得到结果: 参考资料 https://www.cnblogs.com/kingszelda/p/7142689.html
https://stackoverflow.com/questions/23921117/disable-only-full-group-by https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html – set global sql_mode=(select replace(@@sql_mode, ‘ONLY_FULL_GROUP_BY’, ‘’)); – select @@global.sql_mode;
MySQL讲义第 29 讲——select 查询之GROUP BY 使用 GROUP BY 关键字可以将查询结果按照某个字段或多个字段进行分组。分组的依据为 GROUP BY 后面的字段中取值相等的分为一组。GROUP BY 通常与聚合函数一起使用。语法格式如下: GROUP BY 字段名|表达式 [HAVING 条件表达式] [WITH ROLLUP] (1)使用分组查询时,select后面的字段列表只能包含 GROUP BY 后面的字段名或表达式以及聚合函数,不能包含其他字段或表达式,否则会报
resolution will not be reattempted until the update interval of XXX has elapsed or updates are force 125677 阅读