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语句在字段分类之前就已经执行了,在此期间,别名还没有生效,因此找不到指定别名的字段,报错。

posted @   DawnTraveler  阅读(171)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示