Mysql和Oracle在order by上关于聚合函数一些不同的差异
1.问题
SELECT p.PDTNO, p.PDTNAME, sum(a.QUANTITY) AS applySumCount
FROM PRODUCT p
JOIN APPLY a ON p.PDTNO = a.PDTNO
GROUP BY PDTNO
ORDER BY applySumCount DESC;
在Mysql中我们经常将select中聚合函数得到的结果起别名用于order by.
甚至直接使用表达式也是可以的!
SELECT p.PDTNO, p.PDTNAME, sum(a.QUANTITY) AS applySumCount
FROM PRODUCT p
JOIN APPLY a ON p.PDTNO = a.PDTNO
GROUP BY PDTNO
ORDER BY sum(a.QUANTITY) DESC;
但是同样的方式在Oracle中就不行,会报错:ORA-00918: 未明确定义列
2.解决
参考: 聚合函数是否可以写在order by后面,为什么?
在Group by/Order by/Where/ON子句中不能使用....
SQL查询通常按照以下顺序执行:
FROM(指定表或数据源)-> WHERE(筛选条件)-> GROUP BY(分组)-> HAVING(分组后的筛选条件)-> SELECT(选择列和计算聚合函数)-> ORDER BY(排序)。
这个顺序是按照逻辑流程来执行的。聚合函数在SELECT子句中执行,而ORDER BY子句在整个查询的最后执行,以便对最终结果进行排序。
MySQL和Oracle在处理聚合函数在ORDER BY子句中的行为上存在一些差异。
在MySQL中,允许在ORDER BY子句中直接引用聚合函数的结果。这意味着你可以像你的查询那样直接使用applySumCount来排序结果。
而在Oracle中,ORDER BY子句不能直接引用聚合函数的结果。需要在这些子句中使用聚合函教的结果,可以使用子查询来解决
SELECT subquery.PDTNO, subquery.PDTNAME, subquery.applySumCount
FROM (
SELECT p.PDTNO, p.PDTNAME, SUM(a.QUANTITY) AS applySumCount
FROM PRODUCT p
JOIN APPLY a ON p.PDTNO = a.PDTNO
GROUP BY p.PDTNO, p.PDTNAME
) subquery
ORDER BY subquery.applySumCount DESC;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了