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.建 ...
随机推荐
- Mac 识别NTFS移动硬盘
下载工具 TUXERA NTFS 2014
- 在WPF的WebBrowser控件中屏蔽脚本错误的提示
在WPF中使用WebBrowser控件显示网页时,经常会报脚本错误的提示,如何屏蔽掉这些错误提示呢.方法是定义如下方法: public void SuppressScriptErrors(WebBro ...
- mavan 常用命令
Maven库: http://repo2.maven.org/maven2/ Maven依赖查询: http://mvnrepository.com/ Maven常用命令: 1. 创建Maven的普通 ...
- zTree的功能解析
zTree ,一个依靠 jQuery 实现的多功能 "树插件".优异的性能.灵活的配置.多种功能的组合是 zTree 最大优点.兼容 IE.FireFox.Chrome 等浏览器, ...
- mysql 按时间段统计(年,季度,月,天,时)
按年汇总,统计: select sum(mymoney) as totalmoney, count(*) as sheets from mytable group by date_format(col ...
- javascript定时函数
setTimeout(表达式,延迟时间)是定时程序,也就是在什么时间以后干什么,只做一次,就不做了.表达式为字符串函数或其它表达式,时间单位为毫秒 例子:setTimeout("f()&qu ...
- 快速学习C语言四: 造轮子,ArrayList
高级语言里的列表是最常用的数据结构,在C里造个轮子玩玩,C没有泛型,先用int练习. Collection的ADT一般有hasnext,next,add, remove操作,List一般还加了remo ...
- C# Retry重试操作解决方案(附源码)
一.前言 (1)对于Thread的Abort方法,如果线程当前正在执行的是一段非托管代码,那么CLR就不会抛出ThreadAbortException,只有当代码继续回到CLR中时,才会引发Threa ...
- android项目中values中几个文件的作用
最近反编译了几个Android软件,发现一些以前未用到的资源文件:ids.xml——为应用的相关资源提供唯一的资源id.id是为了获得xml中的对象而需要的参数,也就是Object = findVie ...
- VS2008 Pocket PC 2003 SE仿真程序上网设置
设置大体分为3个步骤:Microsoft ActiveSync安装配置.Pocket PC 2003 SE仿真程序配置.Pocket PC 2003连接到Microsoft ActiveSync. 1 ...