rowid列
rowid是一个伪列,在每个数据库中的每个表都存在。但是我们在查询时,默认不返回这一列。这一列的作用是用来区分数据表中的每一行数据,和主键 ID 有相同作用。但一般主键只能保证在当前表中不重复。
我们利用rowid永远不会重复这个特性对表中的数据查重。
案例:
使用 rowid 查重
(同一个表,表1和表2是同一个表的别名)
select * from 表1 where exists(select * from 表2
where 表1.name=表2.name
and 表1.password=表2.password
and 表1.rowid>表2.rowid);
使用主键 id 查重
select * from 表1 where exists(select * from 表2
where 表1.name=表2.name
and 表1.password=表2.password
and 表1.id>表2.id);
删除查出的重复数据
delete from 表1 where exists(select * from 表2
where 表1.name=表2.name
and 表1.password=表2.password
and 表1.rowid>表2.rowid);
分页
rownum伪列
rownum也是一个伪列。他与rowid不同的是,rowid在数据库中物理上是存在的,知识默认查询时不返回。而rownum则在物理上就不存在。
注意,rownum不能使用 rownum>?。rownum是从1开始查询的,先取值(第一次取到的值是1,即1>?),满足条件赋值,不满足则抛弃,所以将会永远1>?;将永远取不到值。
案例:
--先查询出下标小于10的数据
select 表.*,rownum from 表 where rownum<10;
--完整的语句 注意使用rownum别名
select * from (select 表.*,rownum r from 表 where rownum<10)where r>5;