很久以前看某本书整理的,忘了哪本了,现在贡献出来。

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

1

select ename,sal,2casewhen sal<=2000then 'UNDERPAID'3            when sal>=4000then 'OVERPAID'4else'OK'5       end as status6from emp

ENAME SAL STATUS

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

SMITH 800 UNDERPAID

ALLEN 1600 UNDERPAID

WARD 1250 UNDERPAID

JONES 2975 OK

MARTIN 1250 UNDERPAID

BLAKE 2850 OK

CLARK 2450 OK

SCOTT 3000 OK

KING 5000 OVERPAID

TURNER 1500 UNDERPAID

ADAMS 1100 UNDERPAID

JAMES 950 UNDERPAID

FORD 3000 OK

MILLER 1300 UNDERPAID

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

1

select*2  from (3    select ename, job4    from emp5    order by dbms_random.value()6  )7  where rownum<=5

3)按照子串排序

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

1

select ename,job2  from emp3order by substr(job,length(job)-2)

ENAME JOB

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

KING PRESIDENT

SMITH CLERK

ADAMS CLERK

JAMES CLERK

MILLER CLERK

JONES MANAGER

CLARK MANAGER

BLAKE MANAGER

ALLEN SALESMAN

MARTIN SALESMAN

WARD SALESMAN

TURNER SALESMAN

SCOTT ANALYST

FORD ANALYST

4)处理空值排序

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

1

select ename,sal,comm2   from emp3order by comm nulls last

ENAME SAL COMM

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

TURNER 1500 0

ALLEN 1600 300

WARD 1250 500

MARTIN 1250 1400

SMITH 800

JONES 2975

JAMES 950

MILLER 1300

FORD 3000

ADAMS 1100

BLAKE 2850

CLARK 2450

SCOTT 3000

KING 5000

1

select ename,sal,comm2  from emp3order by comm desc nulls first

ENAME SAL COMM

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

SMITH 800

JONES 2975

CLARK 2450

BLAKE 2850

SCOTT 3000

KING 5000

JAMES 950

MILLER 1300

FORD 3000

ADAMS 1100

MARTIN 1250 1400

WARD 1250 500

ALLEN 1600 300

TURNER 1500 0

5)根据数据项的键排序

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

1

select ename,sal,job,comm2  from emp3 order bycasewhen job='SALESMAN' then commelsesal end

ENAME SAL JOB COMM

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

TURNER 1500 SALESMAN 0

ALLEN 1600 SALESMAN 300

WARD 1250 SALESMAN 500

SMITH 800 CLERK

JAMES 950 CLERK

ADAMS 1100 CLERK

MARTIN 1250 SALESMAN 1300

MILLER 1300 CLERK

CLARK 2450 MANAGER

BLAKE 2850 MANAGER

JONES 2975 MANAGER

SCOTT 3000 ANALYST

FORD 3000 ANALYST

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

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

1

select deptno from dept2minus3select deptno from emp

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

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

1

select ename,comm,coalesce(comm,0)2  from emp3where coalesce(comm,0)                                     from emp5                                    where ename='WARD' )

ENAME COMM COALESCE(COMM,0)

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

SMITH 0

ALLEN 300 300

JONES 0

BLAKE 0

CLARK 0

SCOTT 0

KING 0

TURNER 0 0

ADAMS 0

JAMES 0

FORD 0

MILLER 0

8)删除重复记录

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

1

deletefrom dupes2 where id notin( select min(id)3                      from dupes4                     group by name )

9)合并记录

比如如下需求:

如果表EMP_COMMISSION中的某员工也存在于EMP表,那么更新comm为1000

如果以上员工已经更新到1000的员工,如果他们SAL少于2000,删除他们

否则,从表中提取该员工插入表EMP_COMMISSION

1

merge into emp_commission ec2using (select*from emp) emp3    on (ec.empno=emp.empno)4 when matched then5       update set ec.comm=10006deletewhere (sal<2000)7 when not matched then8        insert (ec.empno,ec.ename,ec.deptno,ec.comm)9       values (emp.empno,emp.ename,emp.deptno,emp.comm)

10)用sql生成sql

1

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

(user_tables是oracle的元数据表之一)

CNTS

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

select count(*) from ANT;

select count(*) from BONUS;

select count(*) from DEMO1;

select count(*) from DEMO2;

select count(*) from DEPT;

select count(*) from DUMMY;

select count(*) from EMP;

select count(*) from EMP_SALES;

select count(*) from EMP_SCORE;

select count(*) from PROFESSOR;

select count(*) from T;

select count(*) from T1;

select count(*) from T2;

select count(*) from T3;

select count(*) from TEACH;

select count(*) from TEST;

select count(*) from TRX_LOG;

select count(*) from X;

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

判断字符串里有多少个‘ , ’

1

select (length('10,CLARK,MANAGER')-2  length(replace('10,CLARK,MANAGER',',','')))/length(',')3  as cnt4from t1

先计算原字符串长度,再减去去掉逗号的长度,这个差再除以‘,’的长度

12)将数字和字母分离

原数据是:

DATA

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

SMITH800

ALLEN1600

WARD1250

JONES2975

MARTIN1250

BLAKE2850

CLARK2450

SCOTT3000

KING5000

TURNER1500

ADAMS1100

JAMES950

FORD3000

MILLER1300

1

select replace(2  translate(data,'0123456789','0000000000'),'0') ename,3  to_number(4    replace(5    translate(lower(data),6      'abcdefghijklmnopqrstuvwxyz',7      rpad('z',26,'z')),'z')) sal8  from (9    select ename||sal data from emp10 )

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.

13)根据表中的行创建分割列表

表中数据:

DEPTNO EMPS

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

10 CLARK

10 KING

10 MILLER

20 SMITH

20 ADAMS

20 FORD

20 SCOTT

20 JONES

30 ALLEN

30 BLAKE

30 MARTIN

30 JAMES

30 TURNER

30 WARD

1

select deptno,2    ltrim(sys_connect_by_path(ename,','),',') emps3  from (4  select deptno,5    ename,6    row_number() over7       (partition by deptno order by empno) rn,8    count(*) over9      (partition by deptno) cnt10  from emp11  )12  where level=cnt13  startwithrn=114    connect by prior deptno=deptno and prior rn=rn-1

查询结果

DEPTNO EMPS

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

10 CLARK,KING,MILLER

20 SMITH,JONES,SCOTT,ADAMS,FORD

30 ALLEN,WARD,MARTIN,BLAKE,TURNER,JAMES

14)按字母顺序排序

1

select old_name, new_name2  from (select old_name, replace(sys_connect_by_path(c, ' '), ' ') new_name3          from (select e.ename old_name,4                       row_number() over(partition by e.ename order by substr(e.ename, iter.pos,1)) rn,5                       substr(e.ename, iter.pos,1) c6                  from emp e, (select rownum pos from emp) iter7                 where iter.pos<=length(e.ename)8                 order by1) x9         startwithrn=110        connect by prior rn=rn-111               and prior old_name=old_name)12 where length(old_name)=length(new_name)

You would like the result to be:

OLD_NAME NEW_NAME

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

ADAMS AADMS

ALLEN AELLN

BLAKE ABEKL

CLARK ACKLR

FORD DFOR

JAMES AEJMS

JONES EJNOS

KING GIKN

MARTIN AIMNRT

MILLER EILLMR

SCOTT COSTT

SMITH HIMST

TURNER ENRRTU

WARD ADRW

jor oracle,[整理]sql语句一些实用技巧for oracle相关推荐

  1. oracle sql 符号,Oracle的SQL语句中如何处理‘’符号

    Oracle的SQL语句中如何处理'&'符号 在Oracle中,如果在sql中出现'&'符号,会被自动转义: 而被要求输入在&符号后跟随的字符串的值,例如: update ta ...

  2. Oracle 动态SQL语句

    Oracle 动态SQL语句     EXECUTE IMMEDIATE代替了以前Oracle8i中DBMS_SQLpackage包.  它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块 ...

  3. oracle12测试骤,Oracle中SQL语句解析的步骤

    我们都知道在Oracle中每条SQL语句在执行之前都需要经过解析,这里面又分为软解析和硬解析.那么这两种解析有何不同之处呢?它们又分别是如何进行解析呢?Oracle内部解析的步骤又是如何进行的呢?下面 ...

  4. oracle数据库----SQL语句的实践(应用实例)

    oracle数据库----SQL语句的实践(应用实例) 创建表工资表salary,包括员工号emp_id,员工名emp_name,员工月基本工资monthsal,员工月总发工资totalsal. cr ...

  5. oracle大于条件,oracle中sql语句中的in的条件数量大于1000有问题

    oracle中sql语句中的in的条件数量大于1000有问题 oracle中sql语句中select * from t_Test t where  t.Id in(1,2,3......)/*数量不能 ...

  6. oracle的sql语句,where后面的部分,执行顺序是从左往右,还是从右往左?

    转载自:https://blog.csdn.net/Ideality_hunter/article/details/80689938 oracle的sql语句,where后面的部分,执行顺序是从左往右 ...

  7. oracle 生成 sql语句,Oracle使用SQL语句生成日历的实现方法

    Oracle使用SQL语句可以实现日历的功能,下面就为您详细介绍Oracle使用SQL语句生成日历的实现方法,希望对您能有所帮助. 1 要构造某年某月的日历,必须先知道这个月的开始时间,结束时间及天数 ...

  8. 查询oracle 表达小,oracle中sql语句小练习(使用连接查询)

    假设A(m,n,p),B(m,n,p) --1.A表中有某一项m而B表中没有 使用左连接查询: select a.* from A a left join B b on a.m=b.m where b ...

  9. oracle命中率sql语句

    1 BUFFER命中率 也就是通常所说高速缓存的命中率,这个指标是指通过内存得到访问的数据和所有访问的数据之间的一个比例. 正常指标范围:     Buffer命中率正常的指标为:90%-100%,但 ...

最新文章

  1. Java中的Iterable与Iterator详解
  2. 【直播课】6小时教你掌握MMdetection工程落地实践
  3. Java之关于面向对象
  4. python学习之wxPython
  5. uva10718 - Bit Mask(贪心)
  6. 动易生成栏目时报错“您的栏目页模板有误,缺少小类模板!”,一个解决办法...
  7. in-band(带内) and out-of-band(带外) management
  8. varbinary mysql,如何在MySQL中存储varbinary?
  9. python中rank_hackerrank中python题目的套路
  10. Linux网络配置(NAT模式)
  11. 【前端】日期正则表达式(转发)
  12. coreldraw常用快捷键
  13. 关于matlab文献综述,Matlab文献综述
  14. 2014.3 USACO月赛T1 Watering the Fields
  15. unity3D灯光烘焙(二)
  16. Transformer12
  17. prometheus 阿里云短信告警
  18. SEM和SD的区别和联系,以及其计算方法
  19. 加法链POJ2248
  20. vue实例中template: App,这样写是什么意思

热门文章

  1. Springboot项目中com.mysql.cj.jdbc.Driver在yml文件中爆红的原因
  2. 唐山地震曾重创北京密云水库 为修坝炸掉半座山
  3. 江苏大学计算机考研资料汇总
  4. Linux 内核设计与实现之第17章 设备与模块
  5. 快速排序的几种实现方法
  6. google应用内支付 in-app billing(二)
  7. vite2.0+vue3移动端项目实战
  8. WPS使用复印机的扫描功能
  9. 网络兼职赚钱项目,这5个目前很多人做!
  10. 智简 DC、绿建未来,华为发布下一代数据中心