各数据库分页SQL对比

 

这算是很常见的需求了,但似乎找不到有人总结过。刚好做了类似的事情,赶紧拿出来分享。
SQL都没有经过测试,请看出错误的兄弟们指正一下。

【需求】
用户信息列表,按用户昵称排序。翻到第3页,每页10条数据。

【SQLServer】
SELECT TOP 10 * FROM t_front_um_user_base WHERE c_user_id NOT IN (SELECT TOP 20 c_user_id FROM t_front_um_user_base ORDER BY t_user_nick_name ASC) ORDER BY t_user_nick_name ASC

【PostgreSQL】
SELECT * FROM t_front_um_user_base ORDER BY t_user_nick_name ASC LIMIT 10 OFFSET 20

【Oracle】
SELECT * FROM (SELECT temp.*, ROWNUM rn FROM (SELECT * FROM t_front_um_user_base ORDER BY t_user_nick_name ASC) temp WHERE ROWNUM<30) WHERE rn>=20

【DB2】
SELECT * FROM (*,rownumber() over(ORDER BY t_user_nick_name ASC) AS rn FROM t_front_um_user_base) AS temp WHERE temp.rn BETWEEN 20 AND 30

【MySQL】
SELECT * FROM t_front_um_user_base ORDER BY t_user_nick_name ASC LIMIT 20,10

看上去MySQL和PostgreSQL的做法最优雅。PostgreSQL这么优秀的数据库我不惊讶,MySQL这种土的掉渣的家伙也支持LIMIT子句让我有些意外。
DB2的做法最土,居然要通过函数,按tanfufa的说法在高并发时对CPU的考验可不轻。
SQLServer的做法让我有大开眼界之感,原来SQL也可以写的这么变态的!不就是个分页么,有必要搞成这样么……
DB2和Oracle的做法很霸道,一点通用化的希望都没有。

另外,Oracle的写法里,ROWNUM<30本也可以放在最外面的,但那样效率就低了。现在的写法在数据量大时,翻靠前的页比靠后的页性能好很多。具体啥道理我也没吃透,还是请老谭再解释一下吧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值