sql排序后取前5—10条

说白了,要得到排序后前5 -1 0名的数据,Oracle使用ROW_NUMBER(),PostgreSQL使用子查询+LIMIT/OFFSET,MySQL简单使用LIMIT/OFFSET。

对于Oracle来说,先说最重要的一点。
我们去年运行了该电子商务项目,并使用 ROW_NUMBER() 按订单金额降序排序,取出每个用户最后 1 0 个最高订单中的第 5 到第 1 0 个订单。
关键是在ROW_NUMBER()中添加ORDER BY子句来指定排序字段,否则随机性太大。
还有一点,记得将分页逻辑放在外部查询中。
例如,在Oracle 1 2 c之前,您无法使用OFFSET,只能使用ROWNUM算术来解决该问题。
还有另一个非常关键的细节。
例如,如果要获取每个项目的最后1 0条评论中的第5 条到第1 0条,则需要在外层添加WHERE rn BETWEEN 5 AND 1 0,否则直接使用子查询会导致数据丢失。

我一开始以为PostgreSQL的OFFSET比ROW_NUMBER()简单,但后来发现是错误的。
当管理组之间的跳跃时,逻辑会变得复杂(例如,A 组需要 5 -1 0,B 组需要 5 -1 0)。
特别是当数据量较大时,OFFSET会导致全表扫描。
等等,还有一件事。
PostgreSQL 中的行号应该用作子查询中的变量。
您不能直接使用 ROW_NUMBER() 计算的值作为条件。
很多人没有注意到。

MySQL是最简单的,但是OFFSET对于3 000以上的数量级性能较差。
比如要检查第1 00页的数据,需要跳过前面的9 9 9 9 条。
建议使用WHERE主键ID>last_id AND ID<=last_id+limit或者直接存储游标位置。
说实话,还是挺复杂的,不过大多数场景下,用LIMIT5 OFFSET4 就可以了。

我们建议尝试 Oracle 的 ROW_NUMBER()。
如果有很多分组排序需求的话是最稳定的,但是记得检查并行环境下行号是否会重复。

sql中的排序,如何使用倒序

上周我的朋友问我如何在 SQL 中编写反向排序。
我说,简单,用ORDER BY加DESC关键字。
例如要查看employees表中的工资并按降序排序,则为:
从员工中选择 按工资 DESC 排序;
他点点头,似乎明白了。
不过我提醒他,录入后一定要加上DESC。

2 02 3 年,我还记得我第一次知道这个的时候,我觉得还蛮有趣的。
现在想一想,排序在生活中也很常见,就像排队买票一样,不也是做得很好吗?
朋友点点头说,是的,这个在工作中也经常用到。
然后他问我,如果我想按多列排序怎么办?我说,那就在ORDER BY后面添加多个列名,并用逗号分隔。
例如,按工资降序排列,然后按任期升序排列,则可以这样写:
从员工中选择 ORDER BY 工资 DESC,雇佣日期 ASC;
他眼睛一亮,说道,原来还可以这样用。
我说,是的,SQL在这里很强大,很强大,有不同的功能。

但是后来他问我,如果我只想按一列升序排序怎么办?我说,那就用ASC吧,要不就不写了,因为默认是升序的。
他说哦,那我明白了。

然后他突然问,逆序排序有什么用?我说,就像生活中,有时我们希望看到事物的变化,比如销量最高的产品,或者工资最高的员工。
此时,逆序就非常有用了。

他想了想,说,你说得对,其实挺方便的。
我说,你想办法吧。
你用得越多,你就会变得越熟练。

算了,他最终也没有再问什么。
看来这个解释对他还是很有帮助的。