–rownum 伪列 ‘结果集’中生出的队列,–rownum 伪列 ‘结果集’中爆发的连串

–查询的结果称为’结果集’,–查询的结果称为’结果集’

–注意:rownum和rowid唯有Oracle有,别的数据库是不支持的

–注意:rownum和rowid唯有Oracle有,别的数据库是不帮忙的

select * from scott.dept;
–查询的结果叫做’结果集’

select * from scott.dept;
–查询的结果叫做’结果集’

–rownum 伪列 ‘结果集’中生出的体系
–在底下的结果集中deptno为20的rownum为2
select rownum,deptno,dname,loc 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;

–在下边包车型大巴结果集中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的笔录。

Oracle对rownum的处理,
rownum是在获取结果集的时候爆发的,用于标记结果集中结果顺序的3个字段,
那几个字段被喻为“伪数列”,也正是实在不设有的多少个数列。
它的特征是按“顺序标记”,而且是“逐次递增”的,
换句话说就是唯有存在rownum=1的笔录,才恐怕存在rownum=2的记录。

假诺大家的查询条件伪rownum=2,那么在询问出的率先条记下的时候,
oracle标记此条记录rownum为1,结果发现和rownum=2的规格不符,于是结果集为空。
*/

只要咱们的查询条件伪rownum=2,那么在询问出的首先条记下的时候,
oracle标记此条记录rownum为1,结果发现和rownum=2的规范不符,于是结果集为空。
*/

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

–在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;

–查询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;

–当前页面数 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);

–in
select * from(
澳门永利234555com,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;

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

/*
oracle还提供了其余1个数列:rowid
rowid和rownum差别,一般说来每一行数据对应一个rowid,而且是一定而且唯一的.
在这一行数据存入数据库的时候就明确了。能够知晓成java对象中的内部存款和储蓄器地址.
能够应用rowid来询问记录,而且通过rowid查询记录是查询速度最快的询问方法.
(有哪个人能记住二12位长度的rowid字符?)
rowid唯有在表发生位移(比如表空间变化,数据导入/导出以往),才会产生变化。
*/
–查询dept表的rowid
select rowid,deptno,dname,loc from scott.dept;
–查询rowid=AAAMgxAAEAAAAAQAAA的行数据
select * from scott.dept where rowid = ‘AAAMgxAAEAAAAAQAAA’;

/*
oracle还提供了别的2个数列:rowid
rowid和rownum不相同,一般说来每一行数据对应1个rowid,而且是一定而且唯一的.
在这一行数据存入数据库的时候就规定了。能够知道成java对象中的内部存款和储蓄器地址.
能够应用rowid来询问记录,而且通过rowid查询记录是询问速度最快的询问方法.
(有何人能记住二11个人长度的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;

–删除重复数据
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);

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
);

–使用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;

–保留一条
–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;

–查看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
);

–这里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
);

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