文档章节

sql语句一些实用技巧for oracle

深圳大道
 深圳大道
发布于 2016/12/29 15:36
字数 696
阅读 5
收藏 0

1)在select语句中使用条件逻辑

select ename,sal,   
       case when sal <= 2000 then 'UNDERPAID'  
            when sal >= 4000 then 'OVERPAID'  
            else 'OK'  
       end as status   
from emp

 

2)从表中随机返回n条记录

select *   
  from (   
    select ename, job   
    from emp   
    order by dbms_random.value()   
  )   
where rownum <= 5


3)按照子串排序

--比如要从EMP表中返回员工名字和职位,并且按照职位字段最后2个字符排序

select ename,job   
  from emp   
order by substr(job,length(job)-2)


4)处理空值排序

--被排序的列存在空值,如果希望空值不影响现有排序 

select ename,sal,comm   
   from emp   
order by comm nulls last


5)根据数据项的键排序

--比如如果job是“SALESMAN”,根据COMM排序,否则根据SAL排序 

select ename,sal,job,comm   
  from emp   
order by case when job = 'SALESMAN' then comm else sal end


6)从一个表中查找另一个表中没有的值

--比如要从DEPT中查找在表EMP中不存在数据的所有部门(数据中,DEPTNO值为40的记录在表EMP中不存在) 

select deptno from dept   
minus   
select deptno from emp


7)在运算和比较时使用null值

--null不会等于和不等于任何值,null和自己都不等于。以下例子是当comm有null的情况下列出比“WARD”提成低的员工。 (coalesce函数将null转换为其他值) 

select ename,comm,coalesce(comm,0)   
  from emp   
where coalesce(comm,0) < ( select comm   
                                     from emp   
                                    where ename = 'WARD' )


8)删除重复记录

--对于名字重复的记录,保留一个

delete from dupes   
 where id not in ( select min(id)   
                      from dupes   
                     group by name )


9)合并记录

--如果表EMP_COMMISSION中的某员工也存在于EMP表,那么更新comm为1000 
--如果以上员工已经更新到1000的员工,如果他们SAL少于2000,删除他们 
--否则,从表中提取该员工插入表EMP_COMMISSION 


merge into emp_commission ec   
using (select * from emp) emp   
    on (ec.empno=emp.empno)   
 when matched then  
       update set ec.comm = 1000   
       delete where (sal < 2000)   
 when not matched then  
       insert (ec.empno,ec.ename,ec.deptno,ec.comm)   
       values (emp.empno,emp.ename,emp.deptno,emp.comm)


10)用sql生成sql

select 'select count(*) from '||table_name||';' cnts   
  from user_tables;


 

11)计算字符在字符串里的出现次数

--判断字符串里有多少个‘ , ’
--先计算原字符串长度,再减去去掉逗号的长度,这个差再除以‘,’的长度
select (length('10,CLARK,MANAGER')-   
  length(replace('10,CLARK,MANAGER',',','')))/length(',')   
  as cnt   
from t1


12)将数字和字母分离

原数据是:

DATA
---------------
SMITH800
ALLEN1600
WARD1250
JONES2975
MARTIN1250
BLAKE2850
CLARK2450
SCOTT3000
KING5000
TURNER1500
ADAMS1100
JAMES950
FORD3000
MILLER1300

select replace(   
   translate(data,'0123456789','0000000000'),'0') ename,   
   to_number(   
     replace(   
     translate(lower(data),   
       'abcdefghijklmnopqrstuvwxyz',   
       rpad('z',26,'z')),'z')) sal   
   from (   
     select ename||sal data from emp   
 )


 

ENAME SAL
---------- ----------
SMITH 800
ALLEN 1600
WARD 1250
JONES 2975
MARTIN 1250
BLAKE 2850
CLARK 2450
SCOTT 3000
KING 5000
TURNER 1500
ADAMS 1100
JAMES 950
FORD 3000
MILLER 1300

思路是很复杂的,比如先去除数字,是先把所有数字翻译为0,然后用replace去掉0.

 

本文转载自:http://blog.csdn.net/smartsmile2012/article/details/7942516

深圳大道
粉丝 3
博文 877
码字总数 0
作品 0
深圳
架构师
私信 提问
Oracle开发工具--Oracle SQL Handler

Oracle SQL Handler, 是专为Oracle数据库开发人员及操作人员精心打造的一款Oracle开发工具(客户端工具)。国产原创, 精品奉献, 无序列号限制, 仅凭使用满意度随意赞助就可永久使用! 其优...

匿名
2013/05/28
6.3K
1
PLSQL Developer软件使用大全

PLSQL Developer软件使用大全 第二章 PLSQL Developer配置 2.1 记住密码 这是个有争议的功能,因为记住密码会给带来数据安全的问题。但假如是开发用的库,密码甚至可以和用户名相同,每次输入...

小麦苗best
2018/06/29
0
0
Oracle数据库学习的福利来啦——最佳入门经验分享

适用人群:从事数据库技术实施或售后工程师,准备参加OCA,OCP认证考试 通过学习对Oracle数据库的相关基础知识进行梳理,最终共同提炼出必须最先掌握的那部分知识,无论你是数据库开发、管理、...

让往事随风
2016/04/13
80
0
索引 技巧

避免在索引列上使用计算和函数. WHERE子句中,如果索引列是函数的一部分.优化器将不使用索引而使用全表扫描. 举例: 低效: SELECT … FROM DEPT WHERE SAL * 12 > 25000; 高效: SELECT …...

Reborn-D
2016/10/17
37
0
SQL优化二(SQL性能调优)

一·、前言:这篇博文内容非原创,是我们公司的架构师给我们做技术培训的时候讲的内容,我稍微整理了下,借花献佛。这篇博文只是做一个大概的科普介绍,毕竟SQL优化的知识太大了,几乎可以用...

jmcui
2017/08/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

PostgreSQL 11.3 locking

rudi
今天
5
0
Mybatis Plus sql注入器

一、继承AbstractMethod /** * @author beth * @data 2019-10-23 20:39 */public class DeleteAllMethod extends AbstractMethod { @Override public MappedStatement injectMap......

一个yuanbeth
今天
11
1
一次写shell脚本的经历记录——特殊字符惹的祸

本文首发于微信公众号“我的小碗汤”,扫码文末二维码即可关注,欢迎一起交流! redis在容器化的过程中,涉及到纵向扩pod实例cpu、内存以及redis实例的maxmemory值,statefulset管理的pod需要...

码农实战
今天
4
0
为什么阿里巴巴Java开发手册中不建议在循环体中使用+进行字符串拼接?

之前在阅读《阿里巴巴Java开发手册》时,发现有一条是关于循环体中字符串拼接的建议,具体内容如下: 那么我们首先来用例子来看看在循环体中用 + 或者用 StringBuilder 进行字符串拼接的效率...

武培轩
今天
9
0
队列-链式(c/c++实现)

队列是在线性表功能稍作修改形成的,在生活中排队是不能插队的吧,先排队先得到对待,慢来得排在最后面,这样来就形成了”先进先出“的队列。作用就是通过伟大的程序员来实现算法解决现实生活...

白客C
今天
81
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部