group by按需求保留数据——mysql

在使用group by的时候,我们有时需要根据表中某个字段(学生选课——student.`class`)进行去重,但是我们要根据另一个字段(该字段也有可能是inner join关联过来的其它表的)选择去重后留下来的数据(保留同样选课中学号——student.`num`最大的学生信息

group by在选择显示的数据的时候是默认按照选择的字段(student.`class`)顺序排列的,我们可以使用select子查询先对数据进行筛选和排序(排序order by后面根的就是我们保留参照的字段student.`num`),再进行group by,这样就可以实现保留我们需要的数据

sql语句:SELECT * FROM (   SELECT *  FROM  student b  ORDER BY b.`num` DESC ) AS a GROUP BY a.`class` ORDER BY a.`id` DESC;


group by需要注意以下几点:


(1)Group By子句可以包含任意数目的列,因而可以对分组进行嵌套,进行更细致的分组。


(2)Group By子句中列出的每一列都必须是检索列(或者有效的表达式,注意不能是聚集函数)。如果在SELECT中使用了检索列(或者表达式),则在Group By子句中使用相同的表达式,不能使用别名。


(3)大多数SQL不允许Group By带有可变
roup By子句中列出的每一列都必须是检索列(或者有效的表达式,注意不能是聚集函数)。如果在SELECT中使用了检索列(或者表达式),则在Group By子句中使用相同的表达式,不能使用别名。


长度的数据类型(如文本,text类型)。


(4)除聚集计算语句外,SELECT语句中的每一列都必须在Group By中给出。


(5)如果分组列中包含具有Null值的行,则Null将作为一个分组返回,如果列中有多行Null,他们将作为一个分组返回。


(6)Group By必须出现在Where子句之后,Order By子句之前。


(7)如果在Group By子句中嵌套了分组,数据将在最后指定的分组上进行汇总。换句话说,在建立分组时,指定的所有列都一起计算(不能从个别的列中取回数据)。

### MySQLGROUP BY数据行选择机制 在 MySQL 中,`GROUP BY` 是一种用于对数据进行分组的关键字。它通常与聚合函数(如 `SUM()`、`COUNT()` 或 `AVG()`)一起使用来计算每组的结果[^2]。 当执行带有 `GROUP BY` 子句的查询时,如果没有指定聚合函数,则会遇到非标准行为。具体来说,在某些版本的 MySQL 中,默认情况下允许未被聚集或显式声明为聚合表达式的列出现在 `SELECT` 列表中。这种行为被称为 **“隐藏扩展”**,即对于每个分组只保留一条记录作为代表,并且这条记录的选择具有不确定性——通常是基于存储引擎内部实现细节决定的第一条匹配记录[^3]。 #### 隐藏扩展的风险 如果直接写如下SQL语句: ```sql SELECT customer_id, order_amount FROM orders GROUP BY customer_id; ``` 这里虽然按 `customer_id` 进行了分组操作,但是并没有定义如何处理 `order_amount` 字段。因此,最终显示出来的 `order_amount` 可能来自该客户任意一笔订单金额,这取决于底层物理布局等因素影响下的随机选取过程[^1]。 为了避免上述情况发生并确保结果可预测性和一致性,推荐遵循 SQL 标准做法:要么让所有非聚集字段都参与分组依据;要么通过明确应用相应集合运算符转换成单一数表示形式后再展示出来。例如修改后的正确版可以这样编写: ```sql -- 方法一:仅返回汇总信息 SELECT customer_id, SUM(order_amount) AS total_order_amount FROM orders GROUP BY customer_id; -- 方法二:若确实需要原始明细中的某一行则需额外加条件限定唯一性 SELECT t.* FROM ( SELECT *, ROW_NUMBER() OVER(PARTITION BY customer_id ORDER BY create_time DESC) rn -- 使用窗口函数标记最新的一笔交易 FROM orders ) t WHERE t.rn = 1 ; ``` 以上两种方式分别解决了不同需求场景下关于怎样合理利用 `GROUP BY` 来获取期望输出的问题[^4]。 另外得注意的是性能考量方面,在面对超大规模数据集做复杂分组统计时应考虑优化策略降低资源消耗提升效率比如预先创建覆盖索引或者分区表结构设计等等措施有助于改善查询响应速度[^5]。 ### 结论 综上所述,为了使包含 `GROUP BY` 的查询更加精确可控,应当避免单纯依赖隐含规则带来的不可预期后果,转而采用标准化语法构建清晰逻辑关系从而获得稳定可靠的查询成果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值