Sql 为什么ORDERBY in OVER子句也会影响我的结果集?

Sql 为什么ORDERBY in OVER子句也会影响我的结果集?,sql,oracle,Sql,Oracle,当我写作时: SELECT deptno,ename, RANK () OVER (PARTITION BY deptno ORDER BY sal DESC) rank FROM emp 我得到sal和deptno命令的结果集,但为什么?我没有在主命令中指定它 如果您没有指定主排序依据,则您接收结果的顺序是未指定的,并且将是数据库系统最容易找到的顺序。通常假定默认顺序是行存储在磁盘上的物理顺序,但这是不正确的,这对于数据库来说通常(并非总是)是最简单的 在这种情况下,对所有结果进行排序可以

当我写作时:

SELECT deptno,ename, RANK () OVER (PARTITION BY deptno ORDER BY sal DESC) rank 
FROM emp

我得到sal和deptno命令的结果集,但为什么?我没有在主
命令中指定它

如果您没有指定主
排序依据
,则您接收结果的顺序是未指定的,并且将是数据库系统最容易找到的顺序。通常假定默认顺序是行存储在磁盘上的物理顺序,但这是不正确的,这对于数据库来说通常(并非总是)是最简单的


在这种情况下,对所有结果进行排序可以更容易地计算秩,并且仍然可以提供您要求的结果。

Oracle不会浪费CPU和内存来撤消排序。它可能已经对秩进行了排序,那么为什么要再次随机化元素呢?另一方面,我也不能保证它是被排序的。当您不显式地指定顺序时,数据库引擎可以按照它想要的任何顺序返回结果。当它因为查询的其他部分而改变时,您不应该感到惊讶。