Oracle篇--04 Oracle SQL高级查询、分页查询
1.子查询
子查询是一条SELECT语句,但它是嵌套在其他SQL语句中的,为的是给该SQL提供数据以支持其执行操作。
查看谁的工资高于CLARK?select ename,sal from emp where sal>(select sal from emp where ename=’clark’)
查看与CLARK 同职位的员工?select ename,job from emp where job=(select job from emp where ename=’clark’)
查看与CLARK 同部门的员工?select ename,deptno from emp where deptno=(select deptno from emp where ename=’clark’)
创建表employee,表中字段为:
empno,ename,job,sal,deptno,dname,loc
数据为现有表中emp和dept对应的数据
create table employee asselect e.empno,e.ename,e.job,e.sal,e.deptno,d.dname,d.locfrom emp e,dept dwhere e.deptno=d.deptno(+)
创建表时若子查询中的字段有别名则该表对应的字段就使用该别名作为其字段名,当子查询中一个字段含有函数或表达式,那么该字段必须给别名
create table employee asselect e.empno id,e.ename name,e.job,e.sal,e.deptno,d.dname,d.locfrom emp e,dept dwhere e.deptno=d.deptno(+)
将CLARK所在部门的所有员工删除
delete from employee where deptno=(select deptnp from employee where name=’clark’)
2.子查询的类型
子查询常用于SELECT 语句中,子查询根据查询结果集的不同分为:
单行单列子查询:常用于过滤条件,可以配合=,>,>=,<,<=使用
多行单列子查询:常用于过滤条件,由于查询出多个值,在判断=时要用IN,
判断>,>=等操作要配合ANY,AOR
多行多列子查询:常当作一张表来看待。
查询与salesman同部门的其他职位的员工:
select ename,job,deptno from emp where deptno in(select deptno from emp where job=’salesman’) and job<>’salesman’
查看比职位是clerk和salesman工资都高的员工
select ename,sal from emp where sal >ALL(select sal from emp where job in(‘clerk’,’salesman’))
3.EXISTS关键字
exists后面跟一个子查询,当该子查询可以查询出一条记录时,则exists表达式成立并返回true。
select deptno,dname from dept d where exists(select *from emp e where d.deptno=e.deptno)
查看每个部门的最低薪水是多少?前提是该部门的最低薪水要高于30号部门的最低薪水。
老办法:
(select min(sal),deptno from emp group by deptno )(having min(sal>950))
新办法:
select min(sal),deptno from emp group by deptno having min(select min(sal) from emp group by deptno)
查看比自己所在部门平均工资高的员工?
老办法:
(select avg(sal),deptno from emp group by deptno)(select e.ename,e.sal,e.deptno from emp e,ttt t where e.deptno=t.deptno and e.sal>t.avg(sal))
新办法:
select e.ename,e.sal,e.deptno from emp e,(select avg(sal) avg_sal,deptno from emp group by deptno) t where e.deptno=t.deptno and e.sal>t.avg_sal
在SELECT 子句中使用子查询,可以将查询的结果当作外层查询记录中的一个字段值显示
select e.ename,e.sal,(select d.dname from dept d where d.deptno=e.deptno) dep from emp e
4.分页查询
分页查询是将查询表中数据时分段查询,而不是一次性将所有数据查询出来。有时查询的数据量非常庞大,这回导致系统资源消耗大,相应速度长,数据冗余严重。为此当遇到这种情况时一般使用分页查询解决。数据库基本都支持分页,但是不同数据库语法不同(方言)。
ORACLE中的分页是基于伪列ROWNUM实现的。
ROWNUM不存在与任何一张表中,但是所有的表都可以查询该字段,该字段的值是随着查询自动生成的,该字段值即为该条记录的的行号,从1开始,逐条递增。
在使用ROWNUM对结果集进行编码的查询过程中不能使用ROWNUM做>1的数字判断,否则将查询不出任何数字。
select * from(select rownum rn,empno,ename,sal,job from emp) where rn between 6 and 10.
注意:先用rownum把号都编好,当成一张表
例子:查看工资排名的6-10(嵌套两套子查询:排序、编号、查询)
select *from( select rownum rn, t.*from (select empno,ename,sal from emp order by sal desc)t)where rn between 6 and 10
提高效率
select *from(select rownum rn,t.*from(select empno,ename,sal from emp order by sal desc) twhere rownum<=10)where rn>=6
from(select rownum rn,t.*
from(select empno,ename,sal from emp order by sal desc) t
where rownum<=10)
where rn>=6
计算区间:
pageSize:每页显示IDE条目数
page:页数
star:(page-1)*pageSize+1
end:pageSize*page;
5.DECODE函数
select ename,job,sal,decode(job,’MANAGER’,sal*1.2,‘ANALYST’,sal*1.1,‘SALESMAN’,sal*1.15,sal) bonusfrom emp;
和DECODE函数功能相似的有CASE语句
select ename,job,sal,CASE job WHEN ’MANAGER’ THEN sal*1.2WHEN‘ANALYST’THEN sal*1.1,WHEN‘SALESMAN’THEN sal*1.15,ELSE sal ENDbonusfrom emp;
DEOCE在GROUP BY分组中的应用可以将字段值不同的记录看做一组。
统计人数,将职位是“MANAGER”,“ANALYST”看做一组,其余职业看做另外一组分别统计人数。
selectcount(*),decode(job,'MANAGER','VIP','AVALYST','VIP','OTHER')from empgroup by decode(job,'MANAGER','VIP','AVALYST','VIP','OTHER')
6.排序函数
排序函数允许对结果集按照指定的字段分组,在组内再按照指定的字段排序,最终生成组内编号。
ROW_NUMBER函数生成组内连续且唯一的数字:
查看每个部门的工资排名?
select ename,sal,deptno,row_number() over(PARTITION BY deptnoORDER BY sal DESC)rankFROM emp
RANK函数,生成组内不连续也不唯一的数字,同组内排序字段值一样的记录,生成的数字一样。
查看每个部门的工资排名?
select ename,sal,deptno,RANK() over(PARTITION BY deptnoORDER BY sal DESC))rankFROM emp
DENSE_RANK函数生成组内连续但不唯一的数字。
select ename,sal,deptnoDENSE_RANK() OVER(PARTITION BY deptnoORDER BY sal DESC)rankfrom emp
7.高级分组函数
合并职位是'MANAGER'的员工和薪水大于2500的员工集合,查看两种方式的结果差别
select ename,job,sal from emp where job='MANAGER'UNION
select ename,job,sal from empwhere sal>2500;
select ename,job,sal from empwhere job='MANAGER'UNION ALL
select ename,job,sal from empwhere sal>2500;
交集
SELECT ename,job,sal from empwhere job='MANAGER'INTERSECT
SELECT ename,job,sal,from empwhere sal>2500;
差集
SELECT ename,job,sal, from empwhere job='MANAGER'MINUS
SELECT ename,job,sal from empwhere sal>=2500;
高级分组函数用在GROUP BY 子句中,每个高级分组函数都有一套分组策略。
ROLLUP():分组原则,参数逐次递减,一直到所有参数都不要,每一种分组都统计一次结果,并且并在一个结果集显示。
CUBE():每种组合分一次组,分组次数:2的参数个数次方
Oracle篇--04 Oracle SQL高级查询、分页查询相关推荐
- mysql高级查询~分页查询
一.分页设计原理与设计: 1.分页设计 (1)逻辑分页(假分页/内存分页): 一次性把数据库某张表中所有数据都查询出来,存放到一个List集合中,每次翻页的时候,只需要从内存(List)中去获取指 ...
- 【转】在SQL Server中通过SQL语句实现分页查询
在SQL Server中通过SQL语句实现分页查询 2008年01月06日 星期日 12:28 建立表: CREATE TABLE [TestTable] ( [ID] [int] IDENTITY ...
- Hibernate的几种查询方式 HQL,QBC,QBE,离线查询,复合查询,分页查询
HQL查询方式 这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的语法差不太多.条件查询.分页查询.连接查询.嵌套查询,写起来与SQL语法基本一致,唯一不同的就是把表名换成了 ...
- Mybatis Plus 入门 简单的CRUD 使用详解 条件查询 分页查询 DML操作 MP代码生成器
Mybatis Plus入门 MP是 MybatisPlus,简称MP,是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变.MP为简化开发.提高效率而生. 它已经封装好了 ...
- Hibernate的几种查询方式-HQL,QBC,QBE,离线查询,复合查询,分页查询
HQL查询方式 这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的语法差不太多.条件查询.分页查询.连接查询.嵌套查询,写起来与SQL语法基本一致,唯一不同的就是把表名换成了 ...
- Oracle入门--水表项目(单表查询,链接查询,左右外连接,子查询,分页查询)(3)
水表项目建表 1.1.1 分析 1.1.2 SQL实现 表结构 -- <自来水公司收费系统> -- 1 业主类型表 create table t_ownertype(id number p ...
- oracle mssql 实例,oracle,mysql,SqlServer三种数据库的分页查询的实例
MySql: MySQL数据库实现分页比较简单,提供了 LIMIT函数.一般只需要直接写到sql语句后面就行了. LIMIT子 句可以用来限制由SELECT语句返回过来的数据数量,它有一个或两个参数, ...
- MySQL基础——数据库和SQL概述\MySQL基本使用\DQL语言学习\条件查询\排序查询\常见函数\分组查询\连接查询\子查询\分页查询\联合查询
本文详细讲解了MySQL中DQL语言,也就是数据查询语句的使用.全文3w余字,是对学习MySQL知识的整理总结,因为篇幅较长,MySQL基础知识余下部分发表在余下博客中 DML语言学习\插入数据\删除 ...
- 【Oracle篇】Oracle的客户端工具
可能一提起Oracle的客户端工具,你可能第一反应是PLSQL啊,Navicat等等.不知道你用的Oracle的客户端工具是什么,根据公司要求.个人喜好,也许不能保证每个人用的都是同一个.这篇博客呢, ...
最新文章
- linux学习两周总结
- [Codeforces] Round #320 (Div.2)
- GPUImageMovieWriter实现暂停录制,重新录制
- Linux 之三 静态库及动态库的编写和使用
- win7系统安装信息服务器不可用怎么办,win7系统提示rpc服务器不可用怎么办
- 深度学习入门笔记系列(一)——深度学习框架 tensorflow 的介绍与安装
- CodeForces - 444C DZY Loves Colors(线段树+剪枝)
- 如何根据灰度直方图计算标准差_如何根据电器功率计算电线的粗细?
- 软件工程---07.设计与实现
- Windows 文件同步方案讨论
- C语言开定时器做呼吸灯程序,简单的基于51单片机定时器上呼吸灯程序
- 若依前端如何生成序号?
- cvSaveImage用法
- 几个负载均衡软件比较(Haproxy vs LVS vs Nginx)
- 关于log4j的配置
- 详细教您如何把wav转换成mp3格式
- 基于阿里云 OSS 下载图片跨域问题
- 德国IT民工找工有感
- The authentication type 10 is not supported
- 集大计算机与科学的研究生,明天,我是研究生丨感谢集大,我遇见了更好的自己...