各数据库分页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本也可以放在最外面的,但那样效率就低了。现在的写法在数据量大时,翻靠前的页比靠后的页性能好很多。具体啥道理我也没吃透,还是请老谭再解释一下吧。

你可能感兴趣的:(oracle)