SQL Cookbook
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的更多相关文章
- SQL COOKBOOK SQL经典实例代码 笔记第一章代码
-- SQL COOKBOOK CHAPTER1 -- 查看所有内容 select * from emp; -- 可以单列 select empno,ename,job,sal,mgr,hiredat ...
- 《SQL CookBook 》笔记-第二章-查询结果排序
目录 第二章 查询结果排序 2.1 以指定顺序返回查询结果 2.2 依据子串排序 2.3 排序时对 Null 值的处理 2.4 依据条件逻辑动态调整排序项 第二章 shanzm 第二章 查询结果排序 ...
- 《SQL CookBook 》笔记-第三章-多表查询
目录 3.1 叠加两个行集 3.2 合并相关行 3.3 查找两个表中相同的行 3.4 查找只存在于一个表中的数据 3.5 从一个表检索与另一个表不相关的行 3.6 新增连接查询而不影响其他连接查询 3 ...
- 《SQL CookBook 》笔记-第三章-多表查询-连接查询
目录 1 内连接(inner join) 1.1 隐式的内连接 1.2 显式的内连接 2 外连接(outer join) 2.1 左连接(left outer join) 2.2 右连接(right ...
- 《SQL CookBook 》笔记-第一章-检索记录
目录 第一章 检索记录 1.1检索所有行和列 1.2筛选行 1.3查找满足多个查询条件的行 1.4筛选列 1.5创建列的别名 1.6 在where子句中引用别名列 1.7 串联多列的值 1.8 在se ...
- SQL Cookbook—查询、排序
涉及到的问题1.在select语句中使用条件逻辑2.限制返回的行数3.从表中随机返回n条记录4.将空值转换为实际值5.对字母和数字混合的数据排序6.处理排序空值7.根据数据项的键排序–8.从一个表中查 ...
- SQL Cookbook—字符串
1.遍历字符串2.计算字符在字符串中出现的次数3.从字符串中删除不需要的字符4.将字符和数字数据分离5.判别字符串是不是字母数字型的6.提取姓名的大写首字母缩写7.按字符串中的部分内容排序8.按字符串 ...
- 关于SQL Cookbook里dept与emp表结构以及数据
用MYSQL 写了一下,将number变成int, to_date去掉即可. DROP TABLE IF EXISTS `dept`; CREATE TABLE `dept` ( `DEPTNO` ) ...
- 《SQL CookBook 》笔记-准备工作
目录 准备 1.建立员工表--EMP 2.建立部门表--DEPT 3.EMP表和DEPT表插入数据 4.建立透视表T1,并插入数据 5.建立透视表T10,并插入数据 第二章 shanzm 准备 1.建 ...
随机推荐
- erlang学习笔记(文件操作)
参考这里和这里了解到的文件操作的模块有很多:kernel下有:file,stdlib下有:filelib,filename,file_sorter.(具体查看官方文档)
- 【转】使用Fiddler进行HTTP断点调试。
这是Fiddler又一强大和实用的工具之一.通过设置断点,Fiddler可以做到: 1. 修改HTTP请求头信息.例如修改请求头的UA, Cookie, Referer 信息,通过“伪造”相应信息达到 ...
- testng xml中按顺序执行java类
如红字部份,将安顺序执行4个类 <?xml version="1.0" encoding="UTF-8"?><suite name=" ...
- CA Loves GCD (BC#78 1002) (hdu 5656)
CA Loves GCD Accepts: 135 Submissions: 586 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: ...
- 【Bugly干货分享】手把手教你逆向分析 Android 程序
很多人写文章,喜欢把什么行业现状啊,研究现状啊什么的写了一大通,感觉好像在写毕业论文似的,我这不废话,先直接上几个图,感受一下. 第一张图是在把代码注入到地图里面,启动首页的时候弹出个浮窗,下载网络的 ...
- 人人都是 DBA(VIII)SQL Server 页存储结构
当在 SQL Server 数据库中创建一张表时,会在多张系统基础表中插入所创建表的信息,用于管理该表.通过目录视图 sys.tables, sys.columns, sys.indexes 可以查看 ...
- Wix 安装部署教程(十二) -- 自动更新WXS文件
上一篇分享了一个QuickWIX,用来对比两个工程前后的差异,但是这样还是很繁琐,而且昨天发现有Bug,目录对比有问题.这次改变做法,完全让程序自动去更新WXS文件,然后再用CCNet去自动编译,这样 ...
- C# 关于Try/Catch对系统性能影响的总结
自从开始考虑代码的运行效率和性能以后,写代码考虑的东西越来越多了,比如什么时候应该加try/catch?加太多的try/catch会不会降低性能?今天就来分享一下对try/catch对性能影响的一些看 ...
- 运用DebugDiag诊断ASP.Net异常
Debug Diagnostic Tool (DebugDiag)是用来帮助诊断IIS/COM+等应用假死.性能差.内存泄露及碎片和崩溃等问题的工具. 本文介绍如何运用DebugDiag诊断特定的AS ...
- 【面试必备】CSS盒模型的点点滴滴
从接触CSS布局开始,就一直在听盒模型的概念了,网上的文章有很多,深浅不一.有些人会认为盒模型很简单,不就是border.margin.padding.content嘛,一个元素所占的空间就是把它们都 ...