Mysql和Oracle在group by中的一些差异
1.是否select字段需要全部出现?
Oracle中出现在select列表中的字段或者出现在order by后面的字段,如果不是包含在分组函数中,那么该字段必须同时在group by子句中出现。
Mysql没有此限制
例:
Mysql中,以下SQL语句是成立的,可见这里的Group 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-00979: 不是 GROUP BY 表达式
必须写成: GROUP BY p.PDTNO, p.PDTNAME
才可以
SELECT t1.pdtno, t1.pdtname, t1.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
)t1
ORDER BY t1.applySumCount DESC;
准确来说,这是SQL标准里面严格语法和宽松语法的区别
参考: 神奇的 SQL 之层级 → 为什么 GROUP BY 之后不能直接引用原表中的列
2.Mysql中 group by 和 having 中可以使用别名,Oracle 中不可以
现象
如下:
Mysql中:像这样在Group by中使用别名是可以的
SELECT p.PDTNO pdt, p.PDTNAME, sum(a.QUANTITY) AS applySumCount
FROM PRODUCT p
JOIN APPLY a ON p.PDTNO = a.PDTNO
GROUP BY pdt
ORDER BY sum(a.QUANTITY) DESC;
但是在ORacle中,使用别名会报错:ORA-00904: "PDN": 标识符无效
SELECT t1.pdtno, t1.pdtname, t1.applySumCount
FROM(
SELECT p.PDTNO pdt, p.PDTNAME pdn, sum(a.QUANTITY) AS applySumCount
FROM PRODUCT p
JOIN APPLY a ON p.PDTNO = a.PDTNO
GROUP BY pdt, pdn
)t1
ORDER BY t1.applySumCount DESC;
解释
Sql语句执行顺序为:
(7) SELECT
(8) DISTINCT <select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) HAVING <having_condition>
(9) ORDER BY <order_by_condition>
(10) LIMIT <limit_number>
(7)之后,比如order中,distinct中。
这是因为在SQL执行的时候,WHERE和GROUP语句在字段分类之前就已经执行了,在此期间,别名还没有生效,因此找不到指定别名的字段,报错。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了