1.  利用LAG OVER抑制结果集中的重复值

原始结果如下:

  1. SQL> select deptno,ename from emp order by deptno;
  2.  
  3. DEPTNO ENAME
  4. ------ ----------
  5. 10 CLARK
  6. 10 KING
  7. 10 MILLER
  8. 20 JONES
  9. 20 FORD
  10. 20 ADAMS
  11. 20 SMITH
  12. 20 SCOTT
  13. 30 WARD
  14. 30 TURNER
  15. 30 ALLEN
  16. 30 JAMES
  17. 30 BLAKE
  18. 30 MARTIN
  19.  
  20. 14 rows selected.

使用窗口函数LAG OVER,为每行返回它的前一个DEPTNO

  1. SQL> select lag(deptno)over(order by deptno) lag_deptno,deptno,ename from emp;
  2.  
  3. LAG_DEPTNO DEPTNO ENAME
  4. ---------- ------ ----------
  5. 10 CLARK
  6. 10 10 KING
  7. 10 10 MILLER
  8. 10 20 JONES
  9. 20 20 FORD
  10. 20 20 ADAMS
  11. 20 20 SMITH
  12. 20 20 SCOTT
  13. 20 30 WARD
  14. 30 30 TURNER
  15. 30 30 ALLEN
  16. 30 30 JAMES
  17. 30 30 BLAKE
  18. 30 30 MARTIN
  19.  
  20. 14 rows selected.

观察上面的结果集,对于DEPTNO与LAG_DEPTNO相匹配的行,需要把DEPTNO设置为NULL。使用DECODE可完成此功能(使用TO_NUMBER是为了把DEPTNO转换为数值):

  1. SQL> select to_number(decode(lag(deptno)over(order by deptno),deptno,null,deptno))deptno,
  2. 2 ename from emp;
  3.  
  4. DEPTNO ENAME
  5. ------ ----------
  6. 10 CLARK
  7. KING
  8. MILLER
  9. 20 JONES
  10. FORD
  11. ADAMS
  12. SMITH
  13. SCOTT
  14. 30 WARD
  15. TURNER
  16. ALLEN
  17. JAMES
  18. BLAKE
  19. MARTIN
  20.  
  21. 14 rows selected.

2. 从表中随机返回n条记录--如果直接用 where rownum<=n的话,每次返回的记录都一样

  1. SQL> select * from (
  2. 2 select ename,job from emp order by dbms_random.value()
  3. 3 ) where rownum<=5;

3. 将空值转换为实际值

  1. SQL> select coalesce(comm,0) from emp;

coalesce函数有1个或多个参数,该函数返回列表中的第一个非空值。在本例中,只要comm不为空,就返回comm的值,否则返回0

4. 如何对字母数据混合的数据分别截取字母或者数字

在这里,主要用到translate函数和replace函数

首先,创建视图构建数据

  1. SQL> create view v as select ename ||' '||deptno as data from emp;

查询一下数据

  1. SQL> select * from v;
  2.  
  3. DATA
  4. ---------------------------------------------------
  5. SMITH 20
  6. ALLEN 30
  7. WARD 30
  8. JONES 20

如何从该列中截取字母呢?在这里我们需要用到translate函数和replace函数

translate函数将数字转换为#

  1. SQL> select translate(data,'','#') from v;
  2.  
  3. TRANSLATE(DATA,'','#')
  4. ---------------------------------------------------
  5. SMITH #
  6. ALLEN #
  7. WARD #
  8. JONES #

replace函数将上述结果中#转换为空字符

  1. SQL> select replace(translate(data,'','#'),'#','') from v;
  2.  
  3. REPLACE(TRANSLATE(DATA,'','#'),'#','')
  4. ---------------------------------------------------
  5. SMITH
  6. ALLEN
  7. WARD
  8. JONES

最后,利用replace函数和上述结果截取数字

  1. SQL> select replace(data,replace(translate(data,'','#'),'#',''),'') from v;
  2.  
  3. REPLACE(DATA,REPLACE(TRANSLATE(DATA,'','#
  4. ---------------------------------------------------
  5. 20
  6. 30
  7. 30
  8. 20

 5. 如何输出整点值

  1. SQL> select to_char(TRUNC(sysdate)+(rownum-1)/24,'hh24:mi') from dual connect by rownum<=24;
  2.  
  3. TO_CH
  4. -----
  5. 00:00
  6. 01:00
  7. 02:00
  8. 03:00
  9. 04:00
  10. 05:00
  11. 06:00
  12. 07:00
  13. 08:00
  14. 09:00
  15. 10:00
  16.  
  17. TO_CH
  18. -----
  19. 11:00
  20. 12:00
  21. 13:00
  22. 14:00
  23. 15:00
  24. 16:00
  25. 17:00
  26. 18:00
  27. 19:00
  28. 20:00
  29. 21:00
  30.  
  31. TO_CH
  32. -----
  33. 22:00
  34. 23:00
  35.  
  36. 24 rows selected.

6. 显示各部门员工的工资,并附带显示该部分的最高工资 

  1. SELECT E.DEPTNO,
  2. E.EMPNO,
  3. E.ENAME,
  4. E.SAL,
  5. LAST_VALUE(E.SAL)
  6. OVER(PARTITION BY E.DEPTNO
  7. ORDER BY E.SAL ROWS
  8. --unbounded preceding and unbouned following针对当前所有记录的前一条、后一条记录,也就是表中的所有记录
  9. --unbounded:不受控制的,无限的
  10. --preceding:在...之前
  11. --following:在...之后
  12. BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) MAX_SAL
  13. FROM EMP E;

输出结果如下:

  1. DEPTNO EMPNO ENAME SAL MAX_SAL
  2. ---------- ---------- ---------- ---------- ----------
  3. 10 7934 MILLER 1300 5000
  4. 10 7782 CLARK 2450 5000
  5. 10 7839 KING 5000 5000
  6. 20 7369 SMITH 800 3000
  7. 20 7876 ADAMS 1100 3000
  8. 20 7566 JONES 2975 3000
  9. 20 7788 SCOTT 3000 3000
  10. 20 7902 FORD 3000 3000
  11. 30 7900 JAMES 950 2850
  12. 30 7654 MARTIN 1250 2850
  13. 30 7521 WARD 1250 2850
  14.  
  15. DEPTNO EMPNO ENAME SAL MAX_SAL
  16. ---------- ---------- ---------- ---------- ----------
  17. 30 7844 TURNER 1500 2850
  18. 30 7499 ALLEN 1600 2850
  19. 30 7698 BLAKE 2850 2850

7. 请根据以下emp表信息,写出sql,删除除了ID不同,其它都相同的雇员的冗余信息

  1. SQL> select * from emp;
  2.  
  3. ID USERCOD USERNAME SE ADDRESS MOBILE
  4. ---------- ------- ---------- -- ---------- -----------
  5. 1 9900001 张三 01 guangzhou 13800138000
  6. 2 9900002 李四 02 shanghai 13900139000
  7. 3 9900001 张三 01 guangzhou 13800138000
  8. 4 9900001 张三 02 guangzhou 13800138000
  9. 5 9900002 李四 02 shanghai 13900139000

SQL如下:

  1. SQL> delete from emp where emp.id not in ( select min(id) from emp group by usercode,username,sex,address,mobile);

SQL Cookbook的更多相关文章

  1. SQL COOKBOOK SQL经典实例代码 笔记第一章代码

    -- SQL COOKBOOK CHAPTER1 -- 查看所有内容 select * from emp; -- 可以单列 select empno,ename,job,sal,mgr,hiredat ...

  2. 《SQL CookBook 》笔记-第二章-查询结果排序

    目录 第二章 查询结果排序 2.1 以指定顺序返回查询结果 2.2 依据子串排序 2.3 排序时对 Null 值的处理 2.4 依据条件逻辑动态调整排序项 第二章 shanzm 第二章 查询结果排序 ...

  3. 《SQL CookBook 》笔记-第三章-多表查询

    目录 3.1 叠加两个行集 3.2 合并相关行 3.3 查找两个表中相同的行 3.4 查找只存在于一个表中的数据 3.5 从一个表检索与另一个表不相关的行 3.6 新增连接查询而不影响其他连接查询 3 ...

  4. 《SQL CookBook 》笔记-第三章-多表查询-连接查询

    目录 1 内连接(inner join) 1.1 隐式的内连接 1.2 显式的内连接 2 外连接(outer join) 2.1 左连接(left outer join) 2.2 右连接(right ...

  5. 《SQL CookBook 》笔记-第一章-检索记录

    目录 第一章 检索记录 1.1检索所有行和列 1.2筛选行 1.3查找满足多个查询条件的行 1.4筛选列 1.5创建列的别名 1.6 在where子句中引用别名列 1.7 串联多列的值 1.8 在se ...

  6. SQL Cookbook—查询、排序

    涉及到的问题1.在select语句中使用条件逻辑2.限制返回的行数3.从表中随机返回n条记录4.将空值转换为实际值5.对字母和数字混合的数据排序6.处理排序空值7.根据数据项的键排序–8.从一个表中查 ...

  7. SQL Cookbook—字符串

    1.遍历字符串2.计算字符在字符串中出现的次数3.从字符串中删除不需要的字符4.将字符和数字数据分离5.判别字符串是不是字母数字型的6.提取姓名的大写首字母缩写7.按字符串中的部分内容排序8.按字符串 ...

  8. 关于SQL Cookbook里dept与emp表结构以及数据

    用MYSQL 写了一下,将number变成int, to_date去掉即可. DROP TABLE IF EXISTS `dept`; CREATE TABLE `dept` ( `DEPTNO` ) ...

  9. 《SQL CookBook 》笔记-准备工作

    目录 准备 1.建立员工表--EMP 2.建立部门表--DEPT 3.EMP表和DEPT表插入数据 4.建立透视表T1,并插入数据 5.建立透视表T10,并插入数据 第二章 shanzm 准备 1.建 ...

随机推荐

  1. erlang学习笔记(文件操作)

    参考这里和这里了解到的文件操作的模块有很多:kernel下有:file,stdlib下有:filelib,filename,file_sorter.(具体查看官方文档)

  2. 【转】使用Fiddler进行HTTP断点调试。

    这是Fiddler又一强大和实用的工具之一.通过设置断点,Fiddler可以做到: 1. 修改HTTP请求头信息.例如修改请求头的UA, Cookie, Referer 信息,通过“伪造”相应信息达到 ...

  3. testng xml中按顺序执行java类

    如红字部份,将安顺序执行4个类 <?xml version="1.0" encoding="UTF-8"?><suite name=" ...

  4. CA Loves GCD (BC#78 1002) (hdu 5656)

    CA Loves GCD  Accepts: 135  Submissions: 586  Time Limit: 6000/3000 MS (Java/Others)  Memory Limit: ...

  5. 【Bugly干货分享】手把手教你逆向分析 Android 程序

    很多人写文章,喜欢把什么行业现状啊,研究现状啊什么的写了一大通,感觉好像在写毕业论文似的,我这不废话,先直接上几个图,感受一下. 第一张图是在把代码注入到地图里面,启动首页的时候弹出个浮窗,下载网络的 ...

  6. 人人都是 DBA(VIII)SQL Server 页存储结构

    当在 SQL Server 数据库中创建一张表时,会在多张系统基础表中插入所创建表的信息,用于管理该表.通过目录视图 sys.tables, sys.columns, sys.indexes 可以查看 ...

  7. Wix 安装部署教程(十二) -- 自动更新WXS文件

    上一篇分享了一个QuickWIX,用来对比两个工程前后的差异,但是这样还是很繁琐,而且昨天发现有Bug,目录对比有问题.这次改变做法,完全让程序自动去更新WXS文件,然后再用CCNet去自动编译,这样 ...

  8. C# 关于Try/Catch对系统性能影响的总结

    自从开始考虑代码的运行效率和性能以后,写代码考虑的东西越来越多了,比如什么时候应该加try/catch?加太多的try/catch会不会降低性能?今天就来分享一下对try/catch对性能影响的一些看 ...

  9. 运用DebugDiag诊断ASP.Net异常

    Debug Diagnostic Tool (DebugDiag)是用来帮助诊断IIS/COM+等应用假死.性能差.内存泄露及碎片和崩溃等问题的工具. 本文介绍如何运用DebugDiag诊断特定的AS ...

  10. 【面试必备】CSS盒模型的点点滴滴

    从接触CSS布局开始,就一直在听盒模型的概念了,网上的文章有很多,深浅不一.有些人会认为盒模型很简单,不就是border.margin.padding.content嘛,一个元素所占的空间就是把它们都 ...