需求
有一张表,表内容如下所示:
test表--MySQL 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;
网友评论