rowid: 表示记录的物理地址, 当表中的记录确定下来了, rowid就不会发生变化, 除非删除记录, rowid才会消失我现在对rownum和sequence疑惑? rownum是不是插入记录时设置的sequence的值? 如果是, 这两者有什么区别?
rowid: 表示记录的物理地址, 当表中的记录确定下来了, rowid就不会发生变化, 除非删除记录, rowid才会消失我现在对rownum和sequence疑惑? rownum是不是插入记录时设置的sequence的值? 如果是, 这两者有什么区别?
而sequence是一个数据库对象,是个序列值,根本是两回事。
这是一个在基表中不存在的列,是在生成结果集时加进去的。
打个比方
rownum相当于for循环里的i,只是表示sql查询的数据流水编号而已,同一行数据不同的sql查询就不一样了,最简单的测试order by xx desc sequence是个高级的计数器语言粗俗,不知道说明白没
sequence是创建时开始起作用,相似于某个表,只不过它只有一个值,且通常只能累进
sequence则是一字段类型 定义了某列之后 该列在以后的数值插入时会累加
sequence 是一个计数器
而sequence是用来产生一个序列的,可以用来做主键
序列中两个重要属性
NEXTVAL 返回下一个可用的值
CURRVAL 返回当前的序列中值
对于新定义的序列必须先用NEXTVAL产生值,再可以用CURRVAL返回当前值。
Alter Sequence
修改序列定义
Drop Sequence
从数据库中删除序列
序列的数据字典
user_sequences
应用举例: 0
create sequence NumSeq increment by 1 start with 1 maxvalue 999;//NumSeq 序列名,increment by 1 按1自增,start with 1 从1 开始,maxvalue 999 最大值为999。
create table test (tNo int);
insert into test values(NumSeq.nextval);
select NumSeq.currval from dual
--rownum
select rowid,rownum,empno from emp;//rowid和rownum为隐藏列,每个表都有,平时不显示,
rowid为每一行唯一表示id,是一个绝对地址,rownum为一个序列,是相对的,有可能变化。
select * from emp where rownum<=5;//选定前5条记录,注意:改条件运算符只能使用<或<=,不能使用=或大于,因为根据关系型理论当中,表中的数据是没有限定的。
注意:改条件运算符只能使用 <或 <=,不能使用=或大于,因为根据关系型理论当中,表中的数据是没有限定的。这个没看懂,可否解释一下,谢谢
1.=为什么不行呢??
2.rownum在一个结果集中式无穷大??
因为1是基准,rownum是个相对的东西,必须先有1才能有2,
所以:select * from table where rownum=1
或
select * from table where rownum>=1是正确的
但是
select * from table where rownum=2 或
select * from table where rownum>=2
是查不出数据的,因为rownum一定要找到序列的源头,如果用小于或小于等于的话,很明显序列的源头就是1,这样说不知道你能不能理解