Oracle知识点(+)
1.oracle中group by 和order by同时存在时
2.Oracle数据库-where,group by,having,order by语句的执行顺序 select xxx_name,count(*) as counter from table_y where where_condition group by xxx_name having having_condition order by zzz
当我们看到一个类似上述的包含了where,having, order by等关键字的SQL时,我们要首先要知道其执行顺序是怎样的,才能判断出其所表达的含义; 下面列出其执行顺序:
下面看一个例子: select CategoryName,count(*),AVG(Rating) from BOOKSHELF where Rating>1 group by CategoryName having CategoryName like 'A%' order by count(*) desc
我们现在知道,其执行顺序如下:
oracle日期时间型timestamp相关转换1、获取系统时间的语句(ssxff6获取小数点后面六位) select sysdate,systimestamp,to_char(systimestamp,'yyyymmdd hh24:mi:ssxff6'),'yyyymmdd hh24:mi:ss.ff6') from dual;
2、字符型转成 select to_timestamp('2011-09-14 12:52:42.123456789','syyyy-mm-dd hh24:mi:ss.ff') from dual;
3、 select cast(to_timestamp('2011-09-14 12:52:42.123456789','syyyy-mm-dd hh24:mi:ss.ff') as date) timestamp_to_date from dual;
4、 select cast(sysdate as timestamp) date_to_timestamp from dual;
5、两date的日期相减得出的是天数,而两timestamp的日期相减得出的是完整的年月日时分秒小数秒 select sysdate-sysdate,systimestamp-systimestamp from dual;
select extract(day from inter) * 24 * 60 * 60 + extract(hour from inter) * 60 * 60 + extract(minute from inter) * 60 + extract(second from inter) "seconds" from ( select to_timestamp('2011-09-14 12:34:23.281000000','yyyy-mm-dd hh24:mi:ss.ff') - to_timestamp('2011-09-14 12:34:22.984000000','yyyy-mm-dd hh24:mi:ss.ff') inter from dual );
select extract(second from to_timestamp('2011-09-14 12:34:23.281000000','yyyy-mm-dd hh24:mi:ss.ff'))-extract(second from to_timestamp('2011-09-14 12:34:22.984000000','yyyy-mm-dd hh24:mi:ss.ff')) from dual;
**注:所以, SQL的where执行顺序1 mysql 从左到右. 一个原则,排除越多的条件放到第一个 例子:抄的。 SELECT … WHERE p.languages_id = 1 AND m.languages_id = 1 AND c.languages_id = 1 AND t.languages_id = 1 AND p.products_id IN (472,474)
这样查询需要20多秒,虽然在各个字段上都建立了索引。用分析Explain SQL一分析,发现在第一次分析过程中就返回了几万条数据:
而我改变一下WHERE 字段的位置之后,速度就有了明显地提高: WHERE p.products_id IN (472,474) AND
p.languages_id = 1 AND m.languages_id = 1 AND c.languages_id = 1 AND t.languages_id = 1
这样,第一次的条件是 2 ORCAL 从右到左 sql中查询类型为int的字段,返回null的异常项目中用 org.apache.ibatis.binding.BindingException: Mapper method 'getSort' (xx.yy.cc.DxxDAO) attempted to return null from a method with a primitive return type (int).
抛这样的异常。 解决这个问题,是当查出来为 mysql: SELECT IFNULL(MAX(SORT),0)AS sort FROM web_d_info
oracle: SELECT nvl(MAX(SORT),0) as sort FROM web_d_info
Oracle的NVL函数用法从两个表达式返回一个非 null 值。 语法 NVL(eExpression1,eExpression2)
参数 eExpression1,eExpression2 如果 返回值类型 字符型、日期型、日期时间型、数值型、货币型、逻辑型或 null 值 说明 在不支持 select nvl(a.name,'空得') as name from student a join school b on a.ID=b.ID
注意:两个参数得类型要匹配 SELECT T.d_fdate,T.vc_zhcode,Nvl(SUM(T.f_fzqsz),0) f_price_b,Nvl(SUM(T.f_fzqcb),0) f_cost_b,Nvl(SUM(T.f_fgz_zz),0) f_gz_b,Nvl(SUM(T.f_fyzqsz),0) f_price_Y,Nvl(SUM(T.f_fyzqcb),0) f_cost_Y,Nvl(SUM(T.f_fygz_zz),0) f_gz_Y,T.vc_source,SYSDATE d_updatetime
FROM gz_fund_gzb T
比如这样的判断就很重要啦,因为你不知道哪一行是 oracle order by 处理null值适用情况: 关键字: 默认情况: 指定: select * from Tab_A order by Tab_A. Col_A (asc/desc) nulls first ------>null 值排在最前面 select * from Tab_A order by Tab_A. Col_A (asc/desc) nulls last ------>null 值排在最后面
其他方法: select * from Tab_A order by NVL(Tab_A. Col_A,'abc' ) (asc/desc) ;
Oracle使用order by排序关于null值处理 select * from dual order by age desc nulls last select * from test order by age asc nulls first
sqlserver 认为 null 最小。 升序排列:null 值默认排在最前。 要想排后面,则: 降序排列:null 值默认排在最后。 要想排在前面,则: 解决oracle语句中 含数字的字符串按数字排序问题 例如: 普通排序利用: 但是遇到有中文而且类型是 政采代(甲)字第0298号 政采代(甲)字第0421号 政采代(甲)字第1098号 政采代(甲)字第1267号(延续) 政采代(甲)字第1179号(延续) 但是我们要的结果应该是这样: 政采代(甲)字第0298号 政采代(甲)字第0421号 政采代(甲)字第1098号 政采代(甲)字第1179号(延续) 政采代(甲)字第1267号(延续) 解决办法: order by to_number(regexp_substr(字段名,'[0-9]*[0-9]',1)) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |