分享
 
 
 

Order by 的数值型灵活使用

王朝other·作者佚名  2008-06-01
窄屏简体版  字體: |||超大  

代码:

select * from table_a where id=p_id order by decode(函数,'asc',1,'desc',-1)*jsny;

控制试图的访问时间:

6. 代码:

create view ...

as

select ... from where exists(select x from dual where sysdate>=8:00am and sysdate<=5:00pm)

妙用decode实现排序

代码:

select * from tabname

order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss');

select * from tabname

order by decode(mode,'FIFO',rq-sysdate, sysdate-rq)

找出某个时期内工作日数:

代码:

select count(*)

from ( select rownum-1 rnum

from all_objects

where rownum <= to_date('2002-02-28','yyyy-mm-dd') - to_date('2002-

02-01','yyyy-mm-dd')+1 )

where to_char( to_date('2002-02-01','yyyy-mm-dd')+rnum-1, 'D' ) not

in ( '1', '7' )

我觉得查询重复记录的语句就很经典

代码:

select rowid,bdsszd from BADWDJ a where a.rowid != (select max(rowid) from BADWDJ b where a.bdsszd =b.bdsszd)

由它引申的就有很多有用的语句,如昨天回答别人的排序的难题

代码:

select id,bdsszd from BADWDJ a where a.id = (select max(id) from BADWDJ b where a.bdsszd =b.bdsszd) order by id

树型结构表的查询:

代码:

select ID,PARENT_ID from parent_child

connect by prior id = parent_id

start with id = 1;

1.decode这个函数一定需要会,我觉得sql的灵活很多地方都是通过这个function来体现的,相当于if,很好用。

2.group by,这个东东想想简单,其实好多统计功能是离不开这个操作的。Oracle8中扩充了group by rollup和cube的操作。有时候省了你好多功夫的。值得注重的是,当你对事物做过有效的人为归并之后执行group by 往往会更让人心旷神怡。

3.很表竖置的经典写法,也要记住: 代码:

sum(decode( )) group by ...

注重:需要在一个subquery中确定一个横置判点。

4.树形结构表的遍历写法: 代码:

select ...from ....

start with ... connect by prior

(父子关系表达式)

代码:

select * from xxx where decode(:var,null,'0',column1) = decode(:var,null,'0',:var);

816以上的 一些分析函数如 rank() over() and row_number() over()

当然关于 group by rollup/cube使用的人恐怕非凡少

如何实现最大匹配的操作?

例如:给定字符串 '1234', 而表中可能有记录项'1','12','123','1234','12345',要选出'1234'项

代码:

select * from (

select col_FT from table_FT

where instr('12345',col_FT)=1

order by length(col_FT) desc)

where rownum =1

给你一个意想不到的东西

代码:

SQL> select to_char(to_date(12,'yyyy'),'year') from dual;

TO_CHAR(TO_DATE(12,'YYYY'),'YEAR')

------------------------------------------

twelve

select to_char(sysdate,'day') from dual

还有 d、iw、mm等等格式

对于translate函数有一个功能

比如:找出某个字符串中完全是数字

代码:

select * from xxx where translate(column1,'1234567890','') = column1;

select trunc(sysdate) from dual;

select trunc(sysdate,'mm') from dual;

大家构造几个例子看看就能明白

代码:

select a,b,sum(c) from xxx group by rollup(a,b);

select a,b,sum(c) from xxx group by cube(a,b);

怎么查找字符串里面包含有%的记录:

当然,常规方法就是利用 escape了

可假如不知道escape也行,比如

代码:

select * from xxx where replace(a,'%','') = a;

利用decode解决动态sql的不确定条件查询的问题:

假设前台传入的都是变量

代码:

select * from xxx where decode(:var,null,'0',column1) = decode(:var,null,'0',:var);

这样比 like :var'%' 效率高

另:对于

代码:

select ...

from a,b

where a.a = b.a(+) and b.a is null;

我想对于不明白的朋友,我要交代一下用处才好:

比如,你需要查找在a表中有而b表中没有的记录

也许你会选择 not in:

select * from a aa where aa.a1 not in (select a1 from bb);

这是效率最低的

或者:

select a1 from aa

minus

select a1 from bb;

所有这些写法,都不如下面下率高:

代码:

select a.* from aa a,bb b

where a.a1 = b.a1(+) and b.a1 is null;

给一个很普通的适用的最高效的外连接例子(不是什么新鲜玩意):

select ...

from a,b

where a.a = b.a(+) and b.a is null;

我要按年龄段(小于20,20-30,---)统计人数,我可以用

代码:

select

sum(decode(sign(age - 20),-1,1,0)),

sum(decode(sign(age - 20),-1,0,(decode(sign(age - 30,-1,1,0))))),

sum(decode(sign(age - 30),-1,0,(decode(sign(age - 40,-1,1,0))))),

sum(decode(sign(age - 40),-1,0,(decode(sign(age - 50,-1,1,0))))),

sum(decode(sign(age - 50),-1,0,1))

from xxx;

这样只做一遍表扫描

这是分了20以下和50以上的

类似的问题,自己扩展了

添加行号:

代码:

select (select count(*) from a1 where item <= a.item) AS ROW, * FROM a1 as a order by item

select * from table1 a

where id in (select top 3 from table1 where 物品=a.物品 order by price desc)

每一种物品有很多价格,每一种物品选择排在前三的纪录

1。job的使用:

代码:

DBMS_JOB.SUBM99v(:jobno,//job号

'your_procedure;',//要执行的过程

trunc(sysdate)+1/24,//下次执行时间

'trunc(sysdate)+1/24+1'//每次间隔时间

);

删除job:dbms_job.remove(jobno);

修改要执行的操作:job:dbms_job.what(jobno,what);

修改下次执行时间:dbms_job.next_date(job,next_date);

修改间隔时间:dbms_job.interval(job,interval);

停止job:dbms.broken(job,broken,nextdate);

启动job:dbms_job.run(jobno);

例子:

代码:

VARIABLE jobno number;

begin

DBMS_JOB.SUBM99v(:jobno,

'Procdemo;',//Procdemo为过程名称

SYSDATE, 'SYSDATE + 1/720');

commit;

end;

/

2。把一个表放在内存里

alter table tablename cache.

3。创建临时表

代码:

CREATE GLOBAL TEMPORARY TABLE TABLENAME (

COL1 VARCHAR2(10),

COL2 NUMBER

) ON COMM99v PRESERVE(DELETE) ROWS ;

这种临时表不占用表空间,而且不同的SESSION之间互相看不到对方的数据

在会话结束后表中的数据自动清空,假如选了DELETE ROWS,则在提交的时候即清

空数据,PRESERVE则一直到会话结束

4。加一个自动增加的id号

第一种方法:

第一步:创建SEQUENCE

代码:

create sequence s_country_id increment by 1 start with 1 maxvalue

999999999;

第二步:创建一个基于该表的before insert 触发器,在触发器中使用该

代码:

SEQUENCE

create or replace trigger bef_ins_t_country_define

before insert on t_country_define

referencing old as old new as new for each row

begin

select s_country_id.nextval into :new.country_id from dual;

end;

/

第二种方法:

代码:

CREATE OR REPLACE TRIGGER TR1

BEFORE INSERT ON temp_table

FOR EACH ROW

declare

com_num NUMBER;

BEGIN

SELECT MAX(ID) INTO COM_NUM FROM TEMP_TABLE;

:NEW.ID:=COM_NUM+1;

END TR1;

/

5。限制用户登录:创建一个概要文件

create profile CLERK_PROFILE limit

session_per_user 1 #用户可拥有的会话次数

idle_time 10 #进程处于空闲状态的时间(10分钟)

然后就可以将该概要文件授予一个用户

alter user A profile CLERK_PROFILE;

6。使触发器为无效alter trigger yourtriggername disable

假如是对于某一个表的所有的触发器:

alter table yourtablename disable all triggers

更改数据库时间显示格式:

SQL> alter session set nls_date_format = 'YYYY-MM-DD HH24:MI:SS';

会话已更改。

1. 选取 TOP N 行记录

代码

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有