sql 先order by,再group by的问题。

打个比方来记录一下这个细节问题。

首先有个test表

想要的数据是:甲 status =0 的一条数据。

但如果先group by 再排序,默认机制永远是id=1的显示出来。

我就先写子查询再分组。还是不行。原来是sql语句的问题。

(错误语句)

select * from test where id in (select id from test order by `status` ASC) group by `name` 

研究了一会儿发现好像怎样先排序后分组都不能改变呀。结果突然这样试出来了。。。。

(正确语句)

select * from (select * from test order by `status` ASC)  t GROUP BY t.`name` order by `status` ASC

 

 

 

 

 

 

 

 

 

 

 

 

 

### SQLOrder ByGroup By 同时使用的规则 在 SQL 查询中,`GROUP BY` 子句用于将数据分组,通常与聚合函数一起使用;而 `ORDER BY` 则用于对最终结果集进行排序。两者的组合使用需要遵循特定的语法规则。 #### 执行顺序 在一个查询中同时存在 `WHERE`, `GROUP BY`, `HAVING`, 和 `ORDER BY` 的情况下,其执行顺序如下[^1]: 1. **FROM**: 数据源表的选择。 2. **WHERE**: 过滤不符合条件的数据行。 3. **GROUP BY**: 将符合条件的数据按指定列分组。 4. **HAVING**: 对分组后的数据进一步过滤(允许使用聚合函数)。 5. **SELECT**: 选择要显示的字段或计算表达式。 6. **ORDER BY**: 对最终结果集进行排序。 因此,尽管书写上可能写 `GROUP BY` 而后写 `ORDER BY`,但在实际执行过程中,`ORDER BY` 是最后一步操作。 #### 正确语法 当 `GROUP BY` 和 `ORDER BY` 需要在同一查询中使用时,应按照以下结构编写[^3]: ```sql SELECT column_list, aggregate_functions(...) FROM table_name WHERE condition GROUP BY grouping_columns ORDER BY sorting_columns; ``` 其中: - `column_list`: 可以是具体的列名或者由聚合函数组成的表达式。 - `aggregate_functions(...)`: 像 `SUM()`, `COUNT()`, `AVG()` 等这样的聚合函数。 - `grouping_columns`: 必须出现在 SELECT 子句中的非聚合列。 - `sorting_columns`: 定义排序依据的列或表达式。 注意:如果希望基于某个聚合值来排序,则可以在 ORDER BY 中引用该聚合函数的结果。 #### 使用注意事项 1. 当 `GROUP BY` 出现时,`SELECT` 子句里的每一项要么是非分组列上的聚合函数应用,要么就是参与分组的关键字本身。 2. 如果尝试通过 `ORDER BY` 来调整未被包含于任何集合运算符内的单个记录位置,则需确保这些字段也已声明给 GROUP BY 或者作为独立项目存在于 SELECT 输出列表之中。 3. 在某些数据库实现(如 HiveSQL),对于大规模分布式处理环境下的复杂查询优化器行为可能会带来额外约束条件。 ```sql -- 示例代码展示如何联合运用 GROUP BYORDER BY SELECT department_id, COUNT(*) AS employee_count FROM employees WHERE salary > 5000 GROUP BY department_id ORDER BY employee_count DESC; -- 按照雇员数量降序排列各部门信息 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值