GROUP BY 和 ORDER BY一起使用一些该注意的问题与细节
当同时使用GROUP BY和 ORDER BY执行sql出现过[42000][920] ORA-00920: 无效的关系运算符或者是执行后报错ORA-00979:不是GROUP BY 表达式 这两种情况,由于碰到第二次我还是打开了我的搜索引擎来寻求原因,特此记录。📝
🎯示例
--示例表
select *
from AIMS_SECTION;
📍出现原因情况
- GROUP BY 和 ORDER BY一起使用时,ORDER BY要在GROUP BY的后面,先分组再排序
-- 正确示例
select a.SECTION_NAME,a.SECTION_ID
from AIMS_SECTION a group by a.SECTION_NAME, a.SECTION_ID order by a.SECTION_ID;
- group by 和 order by一起使用时order by 的字段必须是order by 中包含的。
--错误示例
select a.SECTION_NAME,a.SECTION_ID
from AIMS_SECTION a group by a.SECTION_NAME, a.SECTION_ID order by a.SORT_ORDER;
--正确示例
select a.SECTION_NAME,a.SECTION_ID
from AIMS_SECTION a group by a.SECTION_NAME,a.SORT_ORDER, a.SECTION_ID order by a.SORT_ORDER;
- 在使用group by 时,有一个规则需要遵守,即出现在select查询列表中的字段,如果没有在组函数中,那么必须出现在group by 子句中。
--错误示例
select *
from AIMS_SECTION a group by a.SECTION_NAME;
--正确
select a.SECTION_NAME,a.SECTION_ID
from AIMS_SECTION a group by a.SECTION_NAME, a.SECTION_ID;
select a.SECTION_NAME,min(a.SECTION_ID)
from AIMS_SECTION a group by a.SECTION_NAME;
- 在使用group by 时,where 和 having同时存在注意的点。
-
where不能放在group by后面;
-
having是跟group by连在一起用的,放在group by后面,此时的作用相当于分组后的where过滤,可以接受来自group by,where或者from子句的输入;
-
where后面的条件中不能有聚集函数,但是having可以;
-
where是对每一行进行过滤的,having是对查询出结果集分组后的结果进行过滤;