--注意:rownum和rowid只有Oracle有,其它数据库是不支持的

select * from scott.dept;
--查询的结果称为'结果集'

--rownum 伪列 '结果集'中产生的序列
--在下面的结果集中deptno为20的rownum为2
select rownum,deptno,dname,loc from scott.dept;

--在下面的结果集中deptno为20,30的rownum分别为1,2
select rownum,deptno,dname,loc from scott.dept where deptno in(20,30);
--rownum=1 1条数据
select rownum,deptno,dname,loc from scott.dept where rownum = 1;
--rownum=2 0条数据
select rownum,deptno,dname,loc from scott.dept where rownum = 2;
--rownum<3 2条数据
select rownum,deptno,dname,loc from scott.dept where rownum < 3;
--rownum>0 4条数据
select rownum,deptno,dname,loc from scott.dept where rownum > 0;
--rownum>1 正常理解是3条数据,但是结果没有
--没有第一条伪列,就没有后面的伪列,伪列是从1开始递增有顺序的
select rownum,deptno,dname,loc from scott.dept where rownum > 1;

/*
行的标识称为字段
列的标识称为字段名

Oracle对rownum的处理,
rownum是在得到结果集的时候产生的,用于标记结果集中结果顺序的一个字段,
这个字段被称为“伪数列”,也就是事实上不存在的一个数列。
它的特点是按“顺序标记”,而且是“逐次递增”的,
换句话说就是只有存在rownum=1的记录,才可能存在rownum=2的记录。

假设我们的查询条件伪rownum=2,那么在查询出的第一条记录的时候,
oracle标记此条记录rownum为1,结果发现和rownum=2的条件不符,于是结果集为空。
*/

--在Oracle中,利用rownum分页,mysql:limit,sql:server top
select empno,ename from scott.emp;

--查询emp中第6-10条
--in结果集在6,10
select rownum,empno,ename from scott.emp where rownum in (6,10);
--between 结果集在6,7,8,9,10(oracle)
--没有1,不能查询结果
select rownum,empno,ename from scott.emp where rownum between 6 and 10;
--有1,能查到结果
select rownum,empno,ename from scott.emp where rownum between 1 and 10;

--当前页面数 1 每页显示数 5
--利用子查询
--between
select * from(
select rownum as tempid,empno,ename
from scott.emp
)t1
where t1.tempid between 6 and 10;

--in
select * from(
select rownum as tempid,empno,ename
from scott.emp
)t1
where t1.tempid in (6,10);

--练习:提取scott.dept中第3条-第4条记录
select * from(
select rownum as tempid,empno,ename
from scott.emp
)t1
where t1.tempid between 3 and 4;

/*
oracle还提供了另外一个数列:rowid
rowid和rownum不同,一般说来每一行数据对应一个rowid,而且是固定而且唯一的.
在这一行数据存入数据库的时候就确定了。可以理解成java对象中的内存地址.
可以利用rowid来查询记录,而且通过rowid查询记录是查询速度最快的查询方法.
(有谁能记住18位长度的rowid字符?)
rowid只有在表发生移动(比如表空间变化,数据导入/导出以后),才会发生变化。
*/
--查询dept表的rowid
select rowid,deptno,dname,loc from scott.dept;
--查询rowid=AAAMgxAAEAAAAAQAAA的行数据
select * from scott.dept where rowid = 'AAAMgxAAEAAAAAQAAA';

--面试题

--删除重复数据
select * from tb_test;

create table tb_test(
name varchar(18),
age number
);
insert into tb_test(name,age)values('tom',22);
insert into tb_test(name,age)values('jack',21);
insert into tb_test(name,age)values('tom',22);
insert into tb_test(name,age)values('alice',22);
insert into tb_test(name,age)values('tom',22);
insert into tb_test(name,age)values('scott',18);
insert into tb_test(name,age)values('scott',18);

--使用DISTINCT 过滤重复的字段
SELECT distinct name from tb_test
/*
重复数据:tom 22[3] scott 18[2]
1.删除所有重复数据
2.删除重复数据,但是保留一条(保留最大的rowid或者最小)
*/
--1
DELETE FROM tb_test
--此处WHERE nam IN将会把在子查询语句中所得到的name都删除掉
WHERE name IN(
SELECT name
FROM tb_test
GROUP BY name
HAVING COUNT(name)>1
);

--保留一条
--1.通过创建临时表(ddl语句操作,很快)
--注意:使用distinct这种方式只能适用于重复数据是所有列
--当字段比较多(name,age,sex,address,phone...),但是判断重复只是name和age字段,如果是sex呢?就不能使用distinct了
create table tb_tmp as select distinct name,age from tb_test;
--清空表记录
--截断
truncate table tb_test;
--将临时表中的数据插回来
insert into tb_test(name,age) select name,age from tb_tmp;
select * from tb_tmp;

--查看tom的rowid
select rowid,name,age from tb_test where name='tom' and age=22;

--这里max使用min也可以
--把不在最大唯一rowid的按照name,age分组的数据删除掉
delete from tb_test where rowid not in(
--查询唯一rowid
--按照最大的rowid,name,age分组,这样分组后的数据都具有唯一性,不在分组内的数据都应该被删除掉
select MAX(rowid) from tb_test group by name,age
);

delete from tb_test where rowid not in
(
select MIN(rowin) from tb_test group by name,age
);

转载于:https://www.cnblogs.com/hellohowlow/p/8283151.html

Oracle中的rownum和rowid相关推荐

  1. Oracle中查询rownum和rowid的区别

    在查询中,我们可以注意到,类似于"select xx from table where rownum < n"(n>1)这样的查询是有正确含义的,而"sele ...

  2. 转:Oracle中的rownum不能使用大于的问题

    标题:Oracle中的rownum不能使用大于>的问题 转自网络,稍做修改: 一.对rownum的说明 关于Oracle 的 rownum 问题,很多资料都说不支持SQL语句中的"&g ...

  3. oracle中的rownum用法

    对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,而且rownum不能以任何表的名称作为前缀 ...

  4. 【软件测试】Oracle中的rownum用法

    一.对rownum的说明 查看全文 http://www.taodudu.cc/news/show-3538609.html 相关文章: Oracle rownum 用法 Oracle rownum ...

  5. oracle中的rownum函数

    1.rownum函数是oracle中常用到的一个返回编号的函数,系统会按顺序分配为从查询返回的行的编号,返回的第一行的编号是1,第二行是2,后面以此类推x,这个函数可以用来限制查询返回的总行数,也就是 ...

  6. oracle中的rownum

    2019独角兽企业重金招聘Python工程师标准>>> create table person(ID char(6), name VARCHAR2(100)); insert int ...

  7. oracle中rowid列,Oracle中的rowid

    ROWID是ORACLE中的一个重要的概念.用于定位数据库中一条记录的一个相对唯一地址值.通常情况下,该值在该行数据插入到数据库表时即被确定且唯一.ROWID它是一个伪列,它并不实际存在于表中.它是O ...

  8. oracle中 rownum和rowid的用法

    1.ROWNUM的使用--TOP-N分析 使用SELECT语句返回的结果集,若希望按特定条件查询前N条记录,可以使用伪列ROWNUM. ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的 ...

  9. oracle中rownum和row_number()

    row_number()over(partition by col1 order by col2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内 ...

最新文章

  1. 最新综述:自动驾驶中的多模态三维目标检测
  2. 《Java程序员面试宝典》读书笔记1
  3. slot传函数 vue_面试必备 Vue 知识点
  4. python升级命令debian_debian python 2.7.11 升级
  5. 阿德莱德大学招聘博士后研究员
  6. Ajax实现页面局部刷新
  7. suse tomcat mysql_JDK TOMCAT MYSQL SUSE LINUX 环境搭建
  8. oracle共享内存系统全局,Oracle10g 管理系统全局区简介
  9. python networkx教程_Python社交网络——NetworkX入门
  10. 全面详解c语言使用cJSON解析JSON字符
  11. JavaScript 省市县数据
  12. Ubuntu部署KVM服务器
  13. c语言课程信息系统排序学分_您可以免费访问具有实际大学学分的400多种在线课程
  14. 路由器测试的类型和方法
  15. 【Arduino创意】基于蜂鸣器制作摩尔斯电码生成器
  16. 【2017年第3期】电信大数据在信用风险管理中的应用
  17. 记录第一个 python项目 外星人入侵小游戏
  18. Masonry中的mas_makeConstraints方法
  19. 自学Python兼职赚钱靠谱吗?
  20. Scratch软件编程等级考试一级——20191221

热门文章

  1. java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderL,spring获取context...
  2. CocoaPods安装与使用
  3. Mysql学习总结(14)——Mysql主从复制配置
  4. oracle系统级别启动数据库
  5. 说说标准服务器架构(WWW+Image/CSS/JS+File+DB)
  6. c++ 判断nil_golang A=nil,B=A,but B!=nil 这是真的
  7. matlab中.P文件的介绍
  8. 赛灵思FPGA中的主要时钟资源介绍
  9. 关闭计算机后自动开机的解决方法
  10. python网络爬虫---selenium的使用