Oracle sql一些特殊sql示例

1、rowid(行标示符)概述
rowid是一个用来唯一标记表中行的伪列。它是物理表中行数据的内部地址(唯一),包含两个地址,其一为指向数据表中包含该行的块所存放数据文件的地址,另一个是可以直接定位到数据行自身的这一行在数据块中的地址

orale 删除相同的数据

delete from TABLE_NAME a
 where rowid != (select max(rowid)
                   from TABLE_NAME t
                  where a.id = t.id)

2、Rownum(行号)
根据排序插入一列序号

SELECT 
t.id,
 row_number() over(order by t.aa   desc)  order_num
FROM table1  t 

Rownum 不同分页写法的比较
–>> 方式一 在查询的最外层控制分页的最小值和最大值

 SELECT * FROM
 (
SELECT B.*, ROWNUM RN
 FROM (SELECT * FROM TABLE_NAME) B
 )
 WHERE RN BETWEEN 1AND 20

—>>方式 二 绝大多数的情况下,第2个查询的效率比第1个高得多。

 SELECT * FROM
 (
 SELECT B.*, ROWNUM RN
 FROM (SELECT * FROM TABLE_NAME) B
 WHERE ROWNUM <= 20
 )
 WHERE RN >= 1

3、NAL

 SELECT NVL(T.ID,0) AS ID FROM TABLE_NAME  T

nvl(字段名,0),就是当你选出来的时候,这个字段虽然为空,但是显示的是0,当然这个0也可以换成其他东西,如:1,2,3……

4、Merge into

-全部男生记录
create table fzq1 as select * from fzq where sex=1;
--全部女生记录
create table fzq2 as select * from fzq where sex=0;
/*涉及到两个表关联的例子*/
--更新表fzq1使得id相同的记录中chengji字段+1,并且更新name字段。
--如果id不相同,则插入到表fzq1中.
--将fzq1表中男生记录的成绩+1,女生插入到表fzq1中
merge into fzq1 aa     --fzq1表是需要更新的表
using fzq bb            -- 关联表
on (aa.id=bb.id)        --关联条件
when matched then       --匹配关联条件,作更新处理
update set
aa.chengji=bb.chengji+1,
aa.name=bb.name         --此处只是说明可以同时更新多个字段。
when not matched then    --不匹配关联条件,作插入处理。如果只是作更新,下面的语句可以省略。
insert values( bb.id, bb.name, bb.sex,bb.kecheng,bb.chengji);

你可能感兴趣的:(数据库)