Oracle中的ROWNUM rowid 以及MySQL中完成rownum功用相似的句子快报 - 亚美娱乐

Oracle中的ROWNUM rowid 以及MySQL中完成rownum功用相似的句子快报

2019-02-09 11:40:44 | 作者: 灵寒 | 标签: 运用,句子,数据 | 浏览: 7870

1.ROWNUM的运用——TOP-N剖析
运用SELECT句子回来的成果集,若期望按特定条件查询前N条记载,能够运用伪列ROWNUM。
ROWNUM是对成果集加的一个伪列,即先查到成果集之后再加上去的一个列 (着重:先要有成果集)。简略的说ROWNUM是契合条件成果的序列号。它总是从1开端排起的。
运用ROWNUM时,只能运用 、 =、!=符号。

举例:
student(学生)表,表结构为:
ID   char(6) 学号
name VARCHAR2(10) 名字
建表
create table student (ID char(6), name VARCHAR2(10));
增加测验记载
insert into student values(200001,张一);
insert into student values(200002,王二);
insert into student values(200003,李三);
insert into student values(200004,赵四);
commit;
测验
SQL select * from student;
ID  NAME

200001 张一
200002 王二
200003 李三
200004 赵四

⑴ rownum 关于等于某值的查询条件
假如期望找到学生表中第一条学生的信息,能够运用rownum=1作为条件。可是想找到学生表中第二条学生的信息,运用rownum=2成果查不到数据。由于rownum都是从1开端,可是1以上的自然数在rownum做等于判别时以为都是false条件,所以无法查到rownum = n(n 1的自然数)。
SQL select rownum,id,name from student where rownum=1;
  ROWNUM ID  NAME
-
  1 200001 张一

SQL select rownum,id,name from student where rownum =2;
未选定行

⑵ rownum关于大于某值的查询条件
假如想找到从第二行记载今后的记载,当运用rownum 2是查不出记载的,原因是由于rownum是一个总是从1开端的伪列,Oracle 以为rownum n(n 1的自然数)这种条件仍旧不建立,所以查不到记载。
SQL select rownum,id,name from student where rownum
未选定行

那怎么才干找到第二行今后的记载呢?能够运用子查询办法来处理。留意子查询中的rownum有必要要有别号,不然仍是不会查出记载来,这是由于rownum不是某个表的列,假如不起别号的话,无法知道rownum是子查询的列仍是主查询的列。
SQL select * from(select rownum no ,id,name from student) where no
  NO ID  NAME
-
  3 200003 李三
  4 200004 赵四

SQL select * from(select rownum,id,name from student)where rownum
未选定行

⑶ rownum关于小于某值的查询条件
假如想找到第三条记载曾经的记载,当运用rownum 3是能得到两条记载的。明显rownum关于rownum n(n 1的自然数)的条件以为是建立的,所以能够找到记载。
SQL select rownum,id,name from student where rownum
  ROWNUM ID  NAME
-
1 200001 张一
  2 200002 王二

综上几种状况,或许有时分需求查询rownum在某区间的数据,能够看出rownum对小于某值的查询条件是为true的,rownum关于大于某值的查询条件直接以为是false的,可是能够直接的让它转为以为是true的。那就有必要运用子查询。例如要查询rownum在第二行到第三行之间的数据,包含第二行和第三行数据,那么咱们能够写以下句子,先让它回来小于等于3的记载行,然后在主查询中判别新的rownum的别号列大于等于2的记载行。可是这样的操作会在大数据会集影响速度。
SQL select * from (select rownum no,id,name from student where rownum =3 ) where no
  NO ID  NAME
-
  2 200002 王二
  3 200003 李三

⑷ rownum和排序
Oracle中的rownum是在取数据的时分发生的序号,所以想对指定排序的数据指定rowmun行数据就有必要留意了。
SQL select rownum ,id,name from student order by name;
  ROWNUM ID  NAME
-
  3 200003 李三
  2 200002 王二
  1 200001 张一
  4 200004 赵四

能够看出,rownum并不是依照name列来生成的序号。体系是依照记载插入时的次第给记载排的号,rowid也是次第分配的。为了处理这个问题,有必要运用子查询
SQL select rownum ,id,name from (select * from student order by name);
  ROWNUM ID  NAME
-
  1 200003 李三
  2 200002 王二
  3 200001 张一
  4 200004 赵四

这样就成了按name排序,而且用rownum标出正确序号(由小到大)。order by name 假如name是主键或有索引 ,查询出来的rownum彻底依照1,2,3.....的次第。
SQL alter table student add constraint pk_stu primary key(name);
SQL select rownum ,id,name from student order by name;
ROWNUM ID NAME
-
1 200003 李三
2 200002 王二
3 200001 张一
4 200004 赵四


2. ROWID的运用——快速删去重复的记载
ROWID是数据的详细地址,经过rowid,oracle能够快速的定位某行详细的数据的方位。
ROWID能够分为物理rowid和逻辑rowid两种。一般的表中的rowid是物理rowid,索引安排表(IOT)的rowid是逻辑rowid。
当表中有许多重复数据时,能够运用ROWID快速删去重复的记载。
举例:
建表tbl
SQL create table stu(no number,name varchar2(10),sex char(2));
增加测验记载
SQL insert into stu values(1, ab,’男’);
SQL insert into stu values(1, bb,’女’);
SQL insert into stu values(1, ab,’男’);
SQL insert into stu values(1, ab,’男’);
SQL commit;

删去重复记载办法许多,列出两种。
⑴ 经过创立暂时表
能够把数据先导入到一个暂时表中,然后删去原表的数据,再把数据导回原表,SQL句子如下:
SQL create table stu_tmp as select distinct* from stu;
SQL truncate table sut; //清空表记载
SQL insert into stu select * from stu_tmp; //将暂时表中的数据增加回原表

这种办法能够完成需求,可是很明显,关于一个千万级记载的表,这种办法很慢,在出产体系中,这会给体系带来很大的开支,不可行。

⑵ 运用rowid结合max或min函数
运用rowid快速仅有断定重复行结合max或min函数来完成删去重复行。
SQL delete from stu a where rowid not in (select max(b.rowid) from stu b where a.no=b.no and a.name = b.name and a.sex = b.sex); //这儿max运用min也能够
或许用下面的句子
SQL delete from stu a where rowid (select max(b.rowid) from stu b where a.no=b.no and a.name = b.name and a.sex = b.sex); //这儿假如把max换成min的话,前面的where子句中需求把" "改为" "

跟上面的办法思路基本是相同的,不过运用了group by,减少了显性的比较条件,进步功率。
SQL delete from stu where rowid not in (select max(rowid) from stu t group by t.no, t.name, t.sex );

考虑:若在stu表中仅有断定恣意一行数据(1, ab,’男’),把sex字段更新为”女”,怎么做?
SQL update stu set sex=’女’ where rowid=(select min(rowid) from stu where no=1 and name=’ab’ and sex=’男’);








MySQL 怎么完成 Oracle 的 ROWNUM2010/01/28 23:56mysql SELECT * FROM frutas;
+-++
| nombre  | color  |
+-++
| fresa  | rojo  |
| platano  | amarillo |
| manzana  | verde  |
| uva  | verde  |
| pera  | verde  |
| mandarina | naranja  |
| melocoton | marron  |
| limon  | amarillo |
+-++
8 rows in set (0,00 sec)


SELECT @rownum:=@rownum+1 AS rownum, frutas.*
FROM (SELECT @rownum:=0) r, frutas;

mysql SELECT @rownum:=@rownum+1 AS rownum, frutas.*
- FROM (SELECT @rownum:=0) r, frutas;
++-++
| rownum | nombre  | color  |
++-++
|  1 | fresa  | rojo  |
|  2 | platano  | amarillo |
|  3 | manzana  | verde  |
|  4 | uva  | verde  |
|  5 | pera  | verde  |
|  6 | mandarina | naranja  |
|  7 | melocoton | marron  |
|  8 | limon  | amarillo |
++-++
8 rows in set (0,00 sec)


可是怎么把这个查询放在 create view 里边
mysql CREATE VIEW vw_frutas AS SELECT @rownum:=@rownum+1 AS rownum, frutas.*
-   FROM (SELECT @rownum:=0) r, frutas;
ERROR 1351 (HY000): Views SELECT contains a variable or parameter

=

莫非只要自己创立一个函数?










版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表亚美娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章

阅读排行

  • 1

    truncate,delete,drop的异同sohu

    句子,数据,业务
  • 2
  • 3

    Oracle常用命令dongfang

    常用命令,数据库,调用
  • 4
  • 5
  • 6
  • 7

    Catalog与Schemaalibaba

    数据,数据库,环境
  • 8
  • 9

    mysql5 解压缩版装置ITeyedongfang

    装置,数据库,用户
  • 10

    RAC 里边的锁机制ITeye头条

    机制,数据,进程