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

原始结果如下:

SQL> select deptno,ename from emp order by deptno;

DEPTNO ENAME
------ ----------
10 CLARK
10 KING
10 MILLER
20 JONES
20 FORD
20 ADAMS
20 SMITH
20 SCOTT
30 WARD
30 TURNER
30 ALLEN
30 JAMES
30 BLAKE
30 MARTIN 14 rows selected.

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

SQL> select lag(deptno)over(order by deptno) lag_deptno,deptno,ename from emp;

LAG_DEPTNO DEPTNO ENAME
---------- ------ ----------
10 CLARK
10 10 KING
10 10 MILLER
10 20 JONES
20 20 FORD
20 20 ADAMS
20 20 SMITH
20 20 SCOTT
20 30 WARD
30 30 TURNER
30 30 ALLEN
30 30 JAMES
30 30 BLAKE
30 30 MARTIN 14 rows selected.

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

SQL> select to_number(decode(lag(deptno)over(order by deptno),deptno,null,deptno))deptno,
2 ename from emp; DEPTNO ENAME
------ ----------
10 CLARK
KING
MILLER
20 JONES
FORD
ADAMS
SMITH
SCOTT
30 WARD
TURNER
ALLEN
JAMES
BLAKE
MARTIN 14 rows selected.

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

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

3. 将空值转换为实际值

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

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

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

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

首先,创建视图构建数据

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

查询一下数据

SQL> select * from v;

DATA
---------------------------------------------------
SMITH 20
ALLEN 30
WARD 30
JONES 20

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

translate函数将数字转换为#

SQL> select translate(data,'','#') from v;

TRANSLATE(DATA,'','#')
---------------------------------------------------
SMITH #
ALLEN #
WARD #
JONES #

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

SQL> select replace(translate(data,'','#'),'#','') from v;

REPLACE(TRANSLATE(DATA,'','#'),'#','')
---------------------------------------------------
SMITH
ALLEN
WARD
JONES

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

SQL> select replace(data,replace(translate(data,'','#'),'#',''),'') from v;

REPLACE(DATA,REPLACE(TRANSLATE(DATA,'','#
---------------------------------------------------
20
30
30
20

 5. 如何输出整点值

SQL> select to_char(TRUNC(sysdate)+(rownum-1)/24,'hh24:mi') from dual connect by rownum<=24;

TO_CH
-----
00:00
01:00
02:00
03:00
04:00
05:00
06:00
07:00
08:00
09:00
10:00 TO_CH
-----
11:00
12:00
13:00
14:00
15:00
16:00
17:00
18:00
19:00
20:00
21:00 TO_CH
-----
22:00
23:00 24 rows selected.

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

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

输出结果如下:

    DEPTNO      EMPNO ENAME             SAL    MAX_SAL
---------- ---------- ---------- ---------- ----------
10 7934 MILLER 1300 5000
10 7782 CLARK 2450 5000
10 7839 KING 5000 5000
20 7369 SMITH 800 3000
20 7876 ADAMS 1100 3000
20 7566 JONES 2975 3000
20 7788 SCOTT 3000 3000
20 7902 FORD 3000 3000
30 7900 JAMES 950 2850
30 7654 MARTIN 1250 2850
30 7521 WARD 1250 2850 DEPTNO EMPNO ENAME SAL MAX_SAL
---------- ---------- ---------- ---------- ----------
30 7844 TURNER 1500 2850
30 7499 ALLEN 1600 2850
30 7698 BLAKE 2850 2850

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

SQL> select * from emp;

        ID USERCOD USERNAME   SE ADDRESS    MOBILE
---------- ------- ---------- -- ---------- -----------
1 9900001 张三 01 guangzhou 13800138000
2 9900002 李四 02 shanghai 13900139000
3 9900001 张三 01 guangzhou 13800138000
4 9900001 张三 02 guangzhou 13800138000
5 9900002 李四 02 shanghai 13900139000

SQL如下:

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. 《理解 ES6》阅读整理:函数(Functions)(六)Purpose of Functions

    明确函数的双重作用(Clarifying the Dual Purpose of Functions) 在ES5及更早的ES版本中,函数调用时是否使用new会有不同的作用.当使用new时,函数内的th ...

  2. 从KRE到XRE:ASP.NET 5中正在消失的那些K

    前几天写了篇博客ASP.NET 5中的那些K,刚把ASP.NET 5中的那些K搞明白了些,昨天发现微软正在让那些K消失. 首先是在 KRuntime 的git日志中发现的: * Runtime ren ...

  3. 用Nim语言开发windows GUI图形界面程序

    前言 本文得到了“樂師”的大力支持, 我们一起调试程序到深夜,要是没有他的帮忙, 我不知道要多久才能迈过这道坎, 另外“归心”还有其他人也提供了帮助, 他们都来自于QQ群:“Nim开发集中营”4693 ...

  4. 探求网页同步提交、ajax和comet不为人知的秘密(中篇)

    深入研究某项技术,了解使用这些技术的细节,其实最终目的都是为了完成一个选择问题:当我们要使用这些技术解决某个具体的问题时候我们到底该如何去选择.如果碰到有两种技术可以让我们达到同样的目的,我们就会不自 ...

  5. css position全解析

    1.position:static 所有的元素的默认定位都是position:static,这意味着元素没有被定位,而且在文档中出现在它应该在的位置. 2.position:relative 如果设定 ...

  6. Unity3D热更新全书-PageZero

    由于深刻的认识到自己是个思维跳跃的人,深入浅出是个我还要努力很久的目标,为了让大家不至于在我乱七八糟的文字中迷失,特整理目录一份 无分类 <Unity3D热更新全书-何谓热更新,为何热更新,如何 ...

  7. Golang下的Log处理

    原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com 后端系统中的Log是相当重要的,做过高并发服务的同学都会认同这一点.相对而言,调试已经用处不大了,对于这样的项目, ...

  8. Linux系统性能统计工具Sar和实时系统性能监控脚本

    sar(System Activity Reporter系统活动情况报告)是目前 Linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况.系统调用的使用情 ...

  9. [异常解决] JTAG 与STM32的SWD连接接线方式

    如果我们的板子上只留了4个接口:V3.3,SWDIO,SWDCLK,GND.那么和JTAG的连接关系参见下图: dd400cf22b5c01e57a6c9e198d5383a0_189.jpg (0 ...

  10. [stm32] 一个简单的stm32vet6驱动2.4寸240X320的8位并口tft屏DEMO

    书接上文: 最近在研究用低速.低RAM的单片机来驱动小LCD或TFT彩屏实现动画效果 首先我用一个16MHz晶振的m0内核的8位单片机nRF51822尝试驱动一个1.77寸的4线SPI屏(128X16 ...