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

1select ename,sal,   
2       case when sal <= 2000 then 'UNDERPAID'  
3             when sal >= 4000 then 'OVERPAID'  
4            else 'OK'  
5        end as status   
6from 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条记录

1select *   
2   from (   
3     select ename, job   
4     from emp   
5     order by dbms_random.value()   
6   )   
7   where rownum <= 5

3)按照子串排序

比如要从EMP表中返回员工名字和职位,并且按照职位字段最后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

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

4)处理空值排序

当被排序的列存在空值,如果希望空值不影响现有排序
先计算原字符串长度,再减去去掉逗号的长度,这个差再除以‘,’的长度

1select ename,sal,comm   
2    from emp   
3order 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

1select ename,sal,comm   
2   from emp   
3order 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排序

1select ename,sal,job,comm   
2   from emp   
3 order by case when job = 'SALESMAN' then comm else sal 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中不存在)

1select deptno from dept   
2minus   
3select deptno from emp

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

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

1select ename,comm,coalesce(comm,0)   
2   from emp   
3where coalesce(comm,0) < ( select comm   
4                                      from emp   
5                                     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)删除重复记录

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

1delete from dupes   
2 where id not in ( select min(id)   
3                       from dupes   
4                      group by name )

9)合并记录
比如如下需求:
如果表EMP_COMMISSION中的某员工也存在于EMP表,那么更新comm为1000
如果以上员工已经更新到1000的员工,如果他们SAL少于2000,删除他们
否则,从表中提取该员工插入表EMP_COMMISSION

1merge into emp_commission ec   
2using (select * from emp) emp   
3     on (ec.empno=emp.empno)   
4 when matched then  
5        update set ec.comm = 1000   
6       delete where (sal < 2000)   
7 when not matched then  
8         insert (ec.empno,ec.ename,ec.deptno,ec.comm)   
9        values (emp.empno,emp.ename,emp.deptno,emp.comm)  

10)用sql生成sql

1select 'select count(*) from '||table_name||';' cnts   
2   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)计算字符在字符串里的出现次数

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

1select (length('10,CLARK,MANAGER')-   
2   length(replace('10,CLARK,MANAGER',',','')))/length(',')   
3   as cnt   
4from t1   

12)将数字和字母分离

原数据是:

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

1select 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')) sal   
8   from (   
9     select ename||sal data from emp   
10 )   

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

1select deptno,   
2     ltrim(sys_connect_by_path(ename,','),',') emps   
3   from (   
4   select deptno,   
5     ename,   
6     row_number() over   
7        (partition by deptno order by empno) rn,   
8     count(*) over   
9       (partition by deptno) cnt   
10   from emp   
11   )   
12   where level = cnt   
13   start with rn = 1   
14     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)按字母顺序排序

1select old_name, new_name   
2   from (select old_name, replace(sys_connect_by_path(c, ' '), ' ') new_name   
3           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) c   
6                   from emp e, (select rownum pos from emp) iter   
7                  where iter.pos <= length(e.ename)   
8                  order by 1) x   
9          start with rn = 1   
10         connect by prior rn = rn - 1   
11                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

转载于:https://www.cnblogs.com/mlaaalm/archive/2009/04/28/1445617.html

SQL 技巧-ORACLE相关推荐

  1. sqlserver拼接sql插入table_10个SQL技巧

    介 绍 为了理解这 10 个 SQL 技巧的价值,首先需要了解下 SQL 语言的上下文.为什么我要在 Java 会议上讨论 SQL 呢?(我可能是唯一一个在 Java 会议上讨论 SQL 的了)下面讲 ...

  2. sql如何取前几行_10 个不为人知的 SQL 技巧

    在 SQL 中,我们不关心数据库是如何检索信息的,就可以得到结果.本文介绍了使用声明式 SQL10 个不为人知的技巧. 从早期开始,编程语言设计者就有这样的愿望:设计一种语言,在这种语言中,告诉机器我 ...

  3. 您认为不可能的10个SQL技巧

    这样的列表确实有用-它们不仅吸引了人们的注意,如果内容也很有价值(在这种情况下,请相信我),则文章格式可能会非常有趣. 本文将为您带来10条SQL技巧,其中许多人可能都认为不可能. 这篇文章是我在会议 ...

  4. sql技巧_您认为不可能的10个SQL技巧

    sql技巧 这样的列表确实有用-它们不仅吸引了人们的注意,如果内容也很有价值(在这种情况下,请相信我),则文章格式可能会非常有趣. 本文将为您带来10条SQL技巧,其中许多人可能都认为不可能. 这篇文 ...

  5. PL/SQL连接oracle数据库

    PL/SQL连接oracle数据库 1.简单介绍 在不安装oracle数据库的情况下使用pl/sql连接远程oracle数据库. 2.详细步骤: a)      安装PL/SQL.依据自己的操作系统安 ...

  6. windows 客户端的Navicat PL/SQL 连接Oracle 数据库

    PL/SQL 连接Oracle 数据库 1.下载instantclient_11_2文件 官网可以下载 2.本地的监听文件 D:\Program Files\instantclient_11_2\ne ...

  7. SQL Server,Oracle,DB2索引建立语句的对比

    http://database.51cto.com/art/201108/284540.htm SQL Server,Oracle,DB2索引建立语句的对比 2011-08-17 20:48 henr ...

  8. 在Oracle中不通过存储过程一次执行多条SQL语句Oracle PL/SQL

    PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE 服务器和其他工具中了,近几年中更多的开发人员和DBA开始使用PL/SQL,本文将讲述PL/SQL ...

  9. mysql+create+table+index_mysql------基础及常见SQL技巧

    基础 1.1 mysql表复制 复制表结构+复制表数据 mysql>create table t3 like t1; mysql>insert into t3 select * from ...

最新文章

  1. neo4j安装_SpringBoot使用Neo4j
  2. 请求体的方式传参_Angularjs中$http以post请求通过消息体传递参数的实现方法
  3. python调用api应用接口_第三方免费快递物流查询接口平台(快递鸟)api接口调用...
  4. 怎么向easyui grid里面插入空数据_浅谈数据结算(三)
  5. STL容器汇总(二)
  6. C语言Cruskal算法查找最小生成树(附完整源码)
  7. P4424-[HNOI/AHOI2018]寻宝游戏【结论】
  8. g开头的C语言编程软件,C语言函数大全(g开头)
  9. 三维空间坐标的旋转算法详解_视觉slam | 三维空间刚体运动的五种表达:旋转矩阵 变化矩阵 欧拉角 旋转向量 四元数及互相转换...
  10. Problem C: 括号匹配(栈和队列)
  11. ct与x光的哪个辐射大_胸片、CT、PET/CT哪个辐射大?结果你很难猜到
  12. 18.模板引擎(2)
  13. 关于拿到一个别人给你已经上架的App源代码时,首先需要干的几个事情
  14. 【反编译】apk反编译之修改贴吧发贴回帖时显示的地理位置
  15. linux安装思源字体下载,fedora25安装字体-以思源字体为例 适合中文用户
  16. flash遮罩动画的使用技巧
  17. 存储基础(SATA、SCSI、RAID、SAN、SAS、FC)
  18. 网络基础虚拟化VRRP/MSTP冗余技术
  19. Nginx负载均衡配置
  20. PPT中插入avi、mpg、flv、swf及rm、rmvb等视频文件的方法

热门文章

  1. Qt--qss(暗橙色)
  2. 巧妙利用channel进行golang并发式爬虫
  3. 下载文件的响应头设置
  4. Pixhawk(PX4)之驱动详解篇(0)_前期准备(招贤令)
  5. mysql一个用户SQL慢查询分析,原因及优化
  6. c语言现代方法16章 基础、课后习题、基础等
  7. (问题)c语言现代方法2th,自己编写的reminder.c程序 找错/修改/拓展延伸
  8. 概率论-3.4 多维随机变量的特征数
  9. 8086汇编-实验3-编程、编译、链接、跟踪
  10. python画六边形