南京做网站优化的企业排名,学设计在哪学比较好,专业做网站公司哪家技术好,wordpress扫码支付宝ROWNUM伪列
ROWNUM是一个伪列#xff0c;它是根据每次查询的结果动态生成的一列递增编号#xff0c;表示 Oracle 从表中选择该行的顺序#xff0c;选择的第一行ROWNUM为1#xff0c;第二行ROWNUM为2#xff0c;以此类推。
注意1#xff1a;
ROWNUM伪列是在WHERE子句之…ROWNUM伪列
ROWNUM是一个伪列它是根据每次查询的结果动态生成的一列递增编号表示 Oracle 从表中选择该行的顺序选择的第一行ROWNUM为1第二行ROWNUM为2以此类推。
注意1
ROWNUM伪列是在WHERE子句之前生成的就是说它并不是在执行了WHERE子句过滤之后再对数据编号 比如在执行WHERE子句结果数据是这样的
idnameageROWNUM0001mary1810002mike2020003john1930004echoo1640005susy1850006kitty216
这时候的ROWNUM是一列递增排列的、完整的编号 然后如果执行一个WHERE子句WHERE age 18 那数据就变成了
idnameageROWNUM0002mike2020003john1930006kitty216
ROWNUM出现了断层不连续了 如果后面再执行一个ORDER BY age DESC 就变成这样了
idnameageROWNUM0006kitty2160002mike2020003john193
ROWNUM不按顺序排了 所以在利用ROWNUM伪列来对结果集做限制、过滤、排序、分页等操作的时候一定要注意这个点不然很容易错乱
注意2
ROWNUM是一行一行赋值的只有上一行数据被选择成功下一行才会递增而且 select 语句也是一行一行选择的每 select 一行数据就要进行 where 条件判断。 比如有这样一个employees表
idnameage0001mary180002mike200003john190004kitty160005susy180006echoo21
对这个表执行这样一个SQL
SELECT * FROM employees WHERE ROWNUM 1;这句SQL的预期为取出除第一条数据外的所有数据但是执行的结果是一条都选不出来来看执行过程
① select 出的第一条数据为
idnameage0001mary18
② ROWNUM 给这条数据赋值因为是第一条数据所以从 1 开始赋值完是这样的
idnameageROWNUM0001mary181
③ 进行 WHERE ROWNUM 1 条件判断11不满足条件所以第一条数据被过滤掉 ④ select 第二条数据
idnameage0002mike20
⑤ ROWNUM 给这条数据赋值因为上一条数据被过滤掉了所以还是从 1 开始赋值完是这样的
idnameageROWNUM0002mike201
⑥ 进行 WHERE ROWNUM 1 条件判断11不满足条件所以这数据也被过滤掉 ⑦ ············· 一直如此循环直到结束都没有符合条件的数据所以一条数据都选不出来
例1取前10条数据
用ROWNUM来限制查询返回的行数如下例所示
SELECT * FROM employees WHERE ROWNUM 11;WHERE ROWNUM 11表示返回查询数据的前10条
例2取排序后的前10条数据
不能够像下面这样直接在WHERE子句后简单的加上ORDER BY子句了
SELECT * FROM employees WHERE ROWNUM 11 ORDER BY age;因为这里的意思是先执行WHERE子句选出ROWNUM1~10的数据然后再进行排列和我们预想不符。我们要的是按年龄排序后的前10条数据。 所以应该这样写
SELECT *FROM (SELECT * FROM employees ORDER BY employee_id)WHERE ROWNUM 11;这里的意思就是先执行排序然后对排完序的结果集用ROWNUM伪列按顺序编号然后取其中ROWNUM为1~10的那10条数据
例3分页
SELECT *
FROM( SELECT temp_table.*,ROWNUM AS rnFROM (SELECT * FROM employees ORDER BY employee_id) temp_table) result_table
WHERE result_table.rn BETWEEN 起始行数 AND 结尾行数通过嵌套查询的方式把动态的ROWNUM伪列变成固定的列rn然后再用rn列进行分页