Oracle_SQL(7) 复杂查询
1.rownum 伪列
<,<=
select * from emp where rownum<5;
取工资前3名的人员
select * from
(select * from emp order by sal desc)
where rownum<=3;
取每个部门工资的最大值
select deptno,max(sal) from emp group by deptno order by max(sal) desc
取每个部门工资最大的人员
select * from emp,
(select deptno,max(sal) sal from emp group by deptno) emax
where (emp.deptno=emax.deptno or emp.deptno is null and emax.deptno is null)
and emp.sal=emax.sal
取工资第二名的人员
select * from emp where sal=
(select max(sal) from emp where empno in
(select empno from emp
minus
select empno from emp where sal=(select max(sal) from emp)))
取每个部门工资第二的人员
select * from emp,
(select deptno,max(sal) sal from
(select * from emp
minus
select emp.* from emp,
(select deptno,max(sal) sal from emp group by deptno) emax
where (emp.deptno=emax.deptno or emp.deptno is null and emax.deptno is null)
and emp.sal=emax.sal)
group by deptno) esed
where emp.deptno=esed.deptno and emp.sal=esed.sal
获取工资2到5名的职员
select * from
(select emp.*,rownum rn from
(select * from emp order by sal desc) emp
where rownum<=5)
where rn>1
2.分页查询
&pages 当前页码
&counts 每页行数
select * from
(select emp.*,rownum rn from
(select * from emp order by empno) emp
where rownum<=&pages*&counts)
where rn>=(&pages-1)*&counts+1
3.工作日统计
declare
v_start varchar2(10);
v_end varchar2(10);
v_tianshu number;
v_zhou number;
v_yushu number;
v_zhoumo number:=0;
v_result number;
v_date date;
v_diji number;
begin
v_start:='&p_start';
v_end:='&p_end';
select to_date(v_end,'yyyy-mm-dd')-to_date(v_start,'yyyy-mm-dd') into v_tianshu from dual;
select trunc(v_tianshu/7),mod(v_tianshu,7) into v_zhou,v_yushu from dual;
if v_yushu!=0 then
v_date:=to_date(v_start,'yyyy-mm-dd')+v_zhou*7;
for rs in 0..v_yushu-1 loop
select to_char(v_date+rs,'d') into v_diji from dual;
if v_diji=1 or v_diji=7 then
v_zhoumo:=v_zhoumo+1;
end if;
end loop;
end if;
v_result:=v_zhou*5+v_yushu-v_zhoumo;
dbms_output.put_line('工作日:'||v_result);
end;
4.删除重复记录
有主键的表,除主键列外,其它列可能重复,主键列列。
create table emp1 as select * from emp;
alter table emp1 add constraints pk_emp1 primary key (empno);
insert into emp1 (empno,ename,deptno) (select empno+1000,ename,deptno from emp where deptno=20);
select * from emp1 order by deptno,empno;
连主键都没有的表,所有列都可能重复,只有伪列rowid不重复。
create table emp2 as select * from emp;
insert into emp2 (empno,ename,deptno) (select empno,ename,deptno from emp where deptno=30);
select emp2.*,rowid from emp2 order by deptno,empno;
对于重复记录来说,我们需要先确定判断重复的依据,比如ename。
select ename,count(*) from emp1 group by ename having count(*)>1;
select ename,count(1) from emp2 group by ename having count(1)>1
删除重复记录(1):有主键
删前边的记录,保留后边的记录;
delete from emp1 d where empno<any(select empno from emp_1 where ename=d.ename);
delete from emp1 d where exists (select empno from emp1 where ename=d.ename and d.empno<empno);
删后边的记录,保留前边的记录;
delete from emp1 d where empno>any(select empno from emp_1 where ename=d.ename);
删除重复记录(2):无主键
删前边的记录,保留后边的记录;
delete from emp2 d where rowid<any(select rowid from emp2 where ename=d.ename);
删后边的记录,保留前边的记录;
delete from emp2 d where rowid>any(select rowid from emp2 where ename=d.ename);
5.条件查询case when
select emp.*,case deptno
when 10 then '10部门名'
when 20 then '20部门名'
when 30 then '30部门名'
when 40 then '40部门名' end case
from emp;
=》
select emp.*,decode(deptno,10,'10部门名',20,'20部门名',30,'30部门名',40,'40部门名' ) from emp;
select emp.*,case
when sal<1000 then '工资小于1000'
when sal<2000 then '工资小于2000'
when sal<3000 then '工资小于3000'
else '工资大于等于3000' end case
from emp;
=》
select emp.*,decode(sign(sal-1000),-1,'工资小于1000' ,
decode(sign(sal-2000),-1,'工资小于2000' ,
decode(sign(sal-3000),-1,'工资小于3000' ,'工资大于等于3000')))
from emp;
6.with as 语句
作用:将重复使用的sql语句放置在with as 语句中,并设置别名,后续操作引用别名即可,以减少重复sql的执行次数。
with a as (select * from emp where deptno=30)
select * from a
7.父子查询
语法:
select * from table [start with condition1]
connect by [prior] id=parentid
说明:
[start with condition1]:用来限制第一层的数据,以第一层为基础来查找第二层,并以此类推
connect by [prior] id=parentid :用来指明父子关系,及用第一层的id和第二层的parentid匹配
connect by id=[prior] parentid :从下层往上层
level列:树形结构中的层级编号
connect_by_root(字段名)列:获取第一层集结点结果集中的任意字段的值
举例:
从上向下
select emp.*,level,connect_by_root(ename) from emp start with mgr is null
connect by prior empno=mgr
从下向上
select emp.*,level,connect_by_root(ename) from emp start with empno=7369
connect by empno=prior mgr
8.merge into插入或更新
合并两个表的数据,主键不存在则新增,存在则更新。
语法:
merge into 表1
using 表2
on (条件)
when not matched then
insert values(表2.列) where 表2.列=?
when matched then
update set 表1.列=表2.列 where 表1.列=表2.列
9.分析函数OVER (PARTITION BY
9.1 SUM *
SELECT mgr,sal,sum(sal) OVER (PARTITION BY mgr),
sum(sal) OVER (PARTITION BY mgr ORDER BY sal),
sum(sal) OVER (PARTITION BY mgr ORDER BY sal RANGE UNBOUNDED PRECEDING) l_csum
FROM emp;
--范围无限的前面
9.2 AVG *
select mgr,sal,avg(sal) OVER (PARTITION BY mgr),
avg(sal) OVER (PARTITION BY mgr ORDER BY sal),
avg(sal) OVER (PARTITION BY mgr ORDER BY sal ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)
from emp;
--前后延1行
9.3 MAX *
SELECT ename,mgr,sal,
MAX(sal) OVER (PARTITION BY mgr) AS mgr_max
FROM emp;
--按照mgr分组
9.4 MIN *
SELECT ename,mgr,hiredate,sal,
MIN(sal) OVER(PARTITION BY mgr ORDER BY hiredate RANGE UNBOUNDED PRECEDING) as p_cmin
FROM emp;
--按照hiredate排序
9.5 COUNT *
SELECT ename,mgr,sal,
COUNT(*) OVER (PARTITION BY mgr ORDER BY sal RANGE UNBOUNDED PRECEDING) AS mov_count FROM emp;
--前面无限的范围
Oracle_SQL(7) 复杂查询的更多相关文章
- Oracle_SQL(1) 基本查询
1.oracle的安装与卸载 2.PL/SQL Developer的安装 3.登陆PL/SQL Developer 4.SCOTT用户下表的介绍 5.基本查询语句 查询雇员的所有信息: select ...
- oracle_SQL 实验查询及删除重复记录 依据条件 (row)
除数据库表中的重复记录 根据条件 ① 创建表准备数据 创建表 tab_test -- Create table create table TAB_TEST ( ID NUMBER, NAME NVAR ...
- Oracle_SQL(5) 连接和子查询
一.连接join一般分类: inner join: 内连接,又叫等值连接,只返回两个表中连接字段相等的行. left join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录. right ...
- 使用TSQL查询和更新 JSON 数据
JSON是一个非常流行的,用于数据交换的文本数据(textual data)格式,主要用于Web和移动应用程序中.JSON 使用“键/值对”(Key:Value pair)存储数据,能够表示嵌套键值对 ...
- UWP 律师查询 MVVM
APP简介 律师查询是基于聚合数据的律师查询接口做的,这个接口目前处于停用状态,但是,由于我是之前申请的,所以,还可以用,应该是无法再申请了. 效果图 开发 一.HttpHelper 既然是请求接口的 ...
- Elasticsearch 5.0 中term 查询和match 查询的认识
Elasticsearch 5.0 关于term query和match query的认识 一.基本情况 前言:term query和match query牵扯的东西比较多,例如分词器.mapping ...
- ASP.NET Aries 入门开发教程4:查询区的下拉配置
背景: 今天去深圳溜达了一天,刚回来,看到首页都是微软大法好,看来离.NET的春天就差3个月了~~ 回到正题,这篇的教程讲解下拉配置. 查询区的下拉配置: 1:查询框怎么配置成下拉? 在配置表头:格式 ...
- ASP.NET Aries 入门开发教程3:开发一个列表页面及操控查询区
前言: Aries框架毕竟是开发框架,所以重点还是要写代码的,这样开发人员才不会失业,哈. 步骤1:新建html 建一个Html,主要有三步: 1:引入Aries.Loader.js 2:弄一个tab ...
- ExtJS 4.2 业务开发(二)数据展示和查询
本篇开始模拟一个船舶管理系统,提供查询.添加.修改船舶的功能,这里介绍其中的数据展示和查询功能. 目录 1. 数据展示 2. 数据查询 3. 在线演示 1. 数据展示 在这里我们将模拟一个船舶管理系统 ...
随机推荐
- Spring3.0学习1.1(模拟spring)
层次划分 面向抽象编程 带来极大的灵活性 IOC(DI) 依赖注入 控制反转: 正式使用spring IOC 控制反转 不用自己写实现 由容器完成 建议使用appicatiioncontext ...
- C++学习二继承
转载自https://www.cnblogs.com/33debug/p/6666939.html 1.继承与派生 继承是使代码可以复用的重要手段,也是面向对象程序设计的核心思想之一.简单的说,继承 ...
- javascript 中Array.prototype.sort 函数的用法
来源:http://www.jb51.net/article/5769.htm JavaScript中对变量的操作都是通过引用方式,而对数组也一样. 前两天想要对一个数组进行复制,一直苦于找不到办法( ...
- UILabel的一些属性
1.0 lineBreakMode 1.1.0 NSLineBreakByWordWrapping = 0, 以字符为显示单位显示,后面部分省略不显示 NSLineBreakByCharWrapp ...
- Mac中使用pycharm引包matplotlib失败
最开始是使用matplotlib这个包,然后在pycharm中失败,然后在终端中pip install matplotlib,发现,安装了以后,pycharm依然找不到包. 代码如下: import ...
- RGB图片取大于阈值部分
#include<opencv2\opencv.hpp> #include <iostream> using namespace cv; using namespace std ...
- Java 面向切面 AOP
参考: :http://www.blogjava.net/supercrsky/articles/174368.html AOP: Aspect Oriented Programming 即面向切面编 ...
- leetcode 数组类型题总结
1,removeDuplicates(I) int removeDuplicatesI(vector<int>& nums){ // 重新组织数组,同 removeDuplicat ...
- 第十章 优先级队列 (xa1)左式堆:结构
- vm 克隆一台新机器启动网卡报错:device eth0 does not seem to be present, delaying initialization
解决方案: 1. vi /etc/sysconfig/network-scripts/ifcfg-eth0 ifcfg-eth0的配置文件里保存了以前的MAC地址,就把这一行删除掉在重启网卡 2. ...