SQL分别查询表奇偶行(无行号,表结构不修改)

需求

有一张表,表内容如下所示:

《SQL分别查询表奇偶行(无行号,表结构不修改)》 test表–MySQL
《SQL分别查询表奇偶行(无行号,表结构不修改)》 test表–Oracle

注意点
①如上所示,表中没有标识关于行号的字段,比如id神马的
②不准修改表结构,比如使用alter语句

思路

查了一些资料,发现具体的思路大概是,自行生成自增的行号列,然后根据模2的结果进行奇偶的筛选。顺着这个思路下去,会发现oracle中的具体思路是直接使用其提供的row_number函数,而mysql中思路其实差不多,只不过是曲线救国,因为mysql并没有提供row_number函数,所以需要你自己先去实现它,然后和oracle的操作方法就差不多了。

金手指

1.row_number
ROW_NUMBER() OVER(partition by col1 order by col2) 表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内是连续且唯一的)。
2.Mod
语法:MOD(number,divisor)
参数
Number 为被除数。
Divisor 为除数。如果 divisor 为零,函数 MOD 返回值 为原来number
说明
函数MOD可以借用函数 INT 来表示:
MOD(n, d) = n – d*INT(n/d)

实现

Oracle

Oracle中通过查询资料,发现也可以分为两种,一种比较中规中矩点(长一点哈~

select * from (select row_number() over (order by NAME asc) a,t.* from test t) where mod(a,2)=0;

算是严格按照row_number使用路子来滴:

先对列NAME按照升序,再为每条记录返回一个序列号:

还有一种简洁点,如下所示:

select * from (select rownum row_num, t.* from test t)
 where mod(row_num, 2)=1

MySQL

mysql中其实是借助于变量的形式,进行近似row_number的实现,但是要注意的是如果想要重新查询的话,变量要初始化哦~

 set @row = 0;select * from (select @row:=case when @row is null then 1 else @row+1 end as RNr,name,age,class from test) t where t.RNr%2 = 0;

参考文献

  1. SQL查询奇数行、偶数行
  2. Mysql row number()排序函数的用法和注意
  3. oracle row_number()
  4. oracle mod 表达式
  5. 请问oracle如何查询奇数行数据
    原文作者:司小幽
    原文地址: https://www.jianshu.com/p/5ec5e7278110
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞