mysql中关于group的语句指令_MySQL查询中group by语句的使用场景和用法

有成绩表如下,表名称是sc,字段s_id是学生编号,c_id是课程编号,score是课程成绩:

问题:求每位同学的平均成绩?

首先理解题意,分以下几步:

1.根据题意,可以想一下预期的结果是怎样的,应该有几个字段,有几条记录。本题应该有2个字段:学生编号、平均成绩,有7条记录(截图中s_id有七个非重复值);

2.预期的结果有7条记录,而源数据有18条记录,由多条变一条的过程是聚合,需要写聚合函数,而由多条变成比较少记录的过程是分组聚合,需要使用group by语句;

3.需要分组,那group by后面应该跟哪个字段,可以看下预期结果的字段里面,哪个是主键(非空不重复的字段),哪个就是分组字段。学生编号、平均成绩两个字段中,学生编号是主键,所以学生编号就是分组字段;

4.输出的字段写在select语句,from后面跟上表的名称,where后面跟筛选条件(没有可不写),group by 后面跟分组字段,所以这道题的写法如下:

select s_id,avg(score) as 平均成绩 from sc group by s_id;

分组聚合的过程是怎样的?

1.首先是分组,分组字段是s_id,把s_id一样的数据分到一个组,根据s_id把sc表分成七份,效果如下:

2.其次是聚合,聚合是由多变一的过程,就是每一个组变成一条记录,有聚合的取聚合的结果,没有聚合的取每个组的第一条记录,avg(score) 取每个组的成绩的平均成绩(avg是平均函数,属于聚合函数),s_id没有聚合,就取每个组的第一条记录,又因为每个组的s_id都一样,所以取一个是合理的。过程如下:

以上是使用mysql,自己总结的一些心得(也就是网上找不到的),可能不太精准,但可以适用于各种情况,欢迎指正~~

如果感觉有用,给个赞和关注哈,后面会经常更新数据分析相关文章!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在MySQL查询语句,如果使用GROUP BY子句,并且在SELECT子句引用了非聚合列,会出现"ERROR 1140 (42000): In aggregated query without GROUP BY"错误,这是由于MySQL的默认设置是开启了ONLY_FULL_GROUP_BY模式,要避免此错误,可以采取以下几种方法。 1. 使用聚合函数:将所有的非聚合列都使用聚合函数进行处理,例如使用MAX()、MIN()、SUM()等函数。 2. 在SELECT子句列出所有的非聚合列:将非聚合列都在SELECT子句列出,作为GROUP BY子句的一部分。 3. 使用任意值函数:使用任意值函数如ANY_VALUE()可以欺骗MySQL,使其认为不需要严格的GROUP BY限制,但需要注意的是,这样做可能会导致在结果随机返回值。 4. 修改SQL模式:可以通过修改MySQLSQL模式来规避ONLY_FULL_GROUP_BY,可以通过以下命令来修改: SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); 需要注意的是,修改SQL模式会影响全局的MySQL设置,可能对其他查询产生影响,所以在修改前请谨慎考虑。 总之,要规避ONLY_FULL_GROUP_BY错误,可以使用聚合函数、列出所有的非聚合列、使用任意值函数或修改SQL模式等方法。具体选择哪种方法要根据实际情况来决定。 ### 回答2: MySQL的`ONLY_FULL_GROUP_BY`是一个SQL模式,用于控制GROUP BY查询的行为是否严格遵守标准。当启用`ONLY_FULL_GROUP_BY`模式时,任何SELECT语句,SELECT列表的非聚合列必须在GROUP BY子句,或者作为聚合函数的参数。 为了规避`ONLY_FULL_GROUP_BY`,有以下几种方法: 1. 使用聚合函数:将非聚合列作为聚合函数的参数来解决。例如,使用`MAX()`、`MIN()`、`SUM()`等聚合函数对非聚合列进行聚合操作。 2. 使用查询:将GROUP BY查询作为子查询,然后在外部查询进行对非聚合的列的处理。例如,首先对数据进行GROUP BY操作,然后再在外部查询使用聚合函数或其他方式对非聚合列进行处理。 3. 使用ANY_VALUE()函数:`ANY_VALUE()`函数可以允许非聚合的列出现在SELECT列表,并避免`ONLY_FULL_GROUP_BY`错误。它返回一个组内某个非聚合列的任意值。 需要注意的是,根据业务需求和数据一致性,必须确保使用这些方法不会导致数据错误或不一致。因此,在使用这些方法之前,应仔细审查查询逻辑和数据的逻辑关系。另外,可以考虑将`ONLY_FULL_GROUP_BY`模式设置为严格模式,以确保查询的准确性和一致性。 ### 回答3: MySQL的"only_full_group_by"模式是在执行GROUP BY语句时的一个严格模式,要求SELECT语句的列要么在GROUP BY子句进行聚合,要么在SELECT列表作为GROUP BY的列。如果查询出现了不符合该要求的列,MySQL会报错。 要规避"only_full_group_by"模式,可以使用以下方法: 1. 使用合适的聚合函数:将所有的非聚合列都替换为合适的聚合函数,如SUM、MAX、MIN、AVG等。这样就不需要在GROUP BY子句进行聚合,也符合"only_full_group_by"模式的要求。 2. 使用任意值函数:可以使用任意值函数(如ANY_VALUE)来替代非聚合列。这样MySQL会随机选择一个值,作为非聚合列的值。虽然这样可能会导致结果不准确,但可以规避"only_full_group_by"模式。 3. 添加合理的GROUP BY子句:将所有的SELECT列表的列都添加到GROUP BY子句。这样可以确保每个非聚合列都在GROUP BY,并符合"only_full_group_by"模式的要求。 需要注意的是,如果使用了上述方法规避了"only_full_group_by"模式,可能会导致查询结果不准确。所以在使用时需要根据具体的业务需求和数据特点来确定是否需要规避该模式,以及选择合适的方法进行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值