Order by 的数值型灵活使用

2016-02-19 12:40 5 1 收藏

下面请跟着图老师小编一起来了解下Order by 的数值型灵活使用,精心挑选的内容希望大家喜欢,不要忘记点个赞哦!

【 tulaoshi.com - 编程语言 】


  代码:
  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 行记录
  代码

来源:http://www.tulaoshi.com/n/20160219/1601458.html

延伸阅读
MySQL Order By keyword是用来给记录中的数据进行分类的。 MySQL Order By Keyword根据关键词分类 ORDER BY keyword是用来给记录中的数据进行分类的。 MySQL Order By语法 SELECT column_name(s) FROM table_name ORDER BY column_name 注意:SQL语句是“字母大小写不敏感”的语句(它不区分字母的大小写),即:“ORDER ...
先按照下面的表结构创建mysql_order_by_test数据表,我们用实例一点一点告诉你,MySQL order by的用法。 ORDER BY uid ASC 按照uid正序查询数据,也就是按照uid从小到大排列 ORDER BY uid DESC 按照uid逆序查询数据,也就是按照uid从大到小排列 我们来看 SELECT * FROM mysql_order_by_test ORDER BY uid ASC ...
标签: CorelDRAW
     CorelDraw 还有蒙板技术?的确,作为矢量图形处理软件,从理论上讲它并不具备蒙板技术,但其封装图象的功能却能达到部分蒙板技术功能,所以我们也将其归结为蒙板技术来进行讲解。 如上图,矢量图形封装的图象,我们可以这样理解:图象是背景层,而矢量图形是掩膜,背景在掩膜未蒙盖的地方透露了出来。 要...
可能大家都知道dataview这个名词的概念,但也许不是很多人可以说清楚在.net架构中它的应用范围和程度。比如:究竟datagrid和repeater这些控件是如何和数据关联起来的?很多人会告诉我是通过dataset。这显然是正确的,但究竟最根本最直接的是通过什么联系起来的呢? 答案就是dataview。其实下面的语句: DatagridTC.DataSource ...
最近由于需要大概研究了一下MYSQL的随机抽取实现方法。举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT * FROM tablename ORDER BY RAND() LIMIT 1。 但是,后来我查了一下MYSQL的官方手册,里面针对RAND()的提示大概意思就是,在ORDER BY从句里面不能使用RAND()函数,因为这样会导致数据列被多次扫描。但...

经验教程

743

收藏

78
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部