我正在尝试为简单的选择查询添加分页,例如
select rownum rownum_,t.* from (select id,name from table) t
where rownum <=4
但是,当条件存在且条件不存在时,上述查询的行为会有所不同。但是在删除名称列时,行为是一致的。有谁能说出原因?
我理解rownum是在运行查询时确定的,我无法理解的是rownum&lt; = n的where条件会改变顺序
答案 0 :(得分:6)
您必须了解rownum
是伪列。
查询中的rownum
列表示订单(第一个记录,第二个,第三个......)
然后是
返回的记录顺序select id,name from table
不保证。在您的请求中,与第一条记录关联的rownum将始终为1,表示第一条记录每次都可能不同。
总之,当您需要特定订单时,请始终使用ORDER BY
。
答案 1 :(得分:5)
当您使用rownum
进行限制时,该表可能会使用rownum <= 4
上的索引。然后订单可能由索引定义。至少这是它在MySQL中的工作方式。如果您需要特定订购,请始终使用ORDER BY
。
答案 2 :(得分:2)
当您从查询中排除name
列时,将从索引而不是从表中提取id的值,因此您将获得另一个订单。
我敢打赌的第二个问题是因为优化器使用并行来获取更多行。并行线程总是返回“乱序”,因为它们并行检索并行数据。
尝试使用提示/*+ NO_PARALLEL(table) */