6-5 Oracle表复杂查询 -子查询

简介: 子查询是指嵌入在其它sql语句中的select语句,也叫嵌套查询。

Oracle基础知识整理:C站下载链接


文章目录


6 Oracle 表的管理

6.5 oracle表的管理 -表查询(重点)

6.5.4 Oracle表复杂查询 -子查询

·什么是子查询

·单行子查询

·多行子查询

·多列子查询

·在form子句中使用子查询

.分页查询


6 Oracle 表的管理

6.5 oracle表的管理 -表查询(重点)

6.5.4 Oracle表复杂查询 -子查询

·什么是子查询


子查询是指嵌入在其它sql语句中的select语句,也叫嵌套查询


·单行子查询


**单行子查询:**是指返回一行数据的子查询语句


请思考:如何显示与SMITH同一部门的所有员工?

select ename from emp where deptno=  (select deptno from emp where   ename='SMITH');

·数据库在执行sql语句的时候,是从左到右, 扫描的时候是从右到左


·多行子查询


**多行子查询:**指返回多行数据的子查询


请思考:如何查询和部门10的工作相同的雇员的名字、岗位、工资、部门号

select * from emp where job in(select distinct job from emp where deptno=10);


·在多行子查询中使用all操作符


请思考:如何显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号


方法一:


select ename,sal,deptno from emp where sal >all(select sal from emp where deptno=30 );

select ename,sal,deptno from emp where   sal >all(select sal from emp where   deptno=30 );

方法二:(执行效率高)

select ename,sal,deptno from emp where  sal>(select max(sal) from emp where  deptno=30);

·在多行子查询中使用any操作符


请思考:如何显示工资比部门30的任意一个员工的工资高的员工的姓名、工资和部门号


方法一:

select ename,sal,deptno from emp where   sal > any (select sal from emp where   deptno=30 );

方法二:(执行效率高)

select ename,sal,deptno from emp where  sal>(select min(sal) from emp where  deptno=30);

select ename,sal,deptno from emp where sal>(select min(sal) from emp where deptno=30);


·多列子查询


**单行子查询:**是指子查询返回单列、单行数据,多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询则是指查询返回多个列数据的子查询语句


请思考:如何查询与SMITH的部门和岗位完全相同的所有雇员


方法一:

select * from emp where deptno=(select deptno from emp where ename='SMITH')and job=(select job from emp where ename= 'SMITH');

方法二:(效率高)

select * from emp where (deptno,job) =(select deptno,job from emp where ename='SMITH');

·在form子句中使用子查询


请思考:如何显示高于自己部门平均工资的员工的信息

select 1.ename,a1.deptno,a1.sal,a2.mysal
from emp a1,
(select deptno,avg(sal) mysal from emp  group by deptno ) a2 where a1.deptno=a2.deptno and a1.sal>a2.mysal  order by a1.deptno;


实现步骤:先查询各个部门的编号和平均工资(平均工资起个别名)作为一个新表,起个别名,与emp表进行表连接查询。


·总结:


这里需要说明的当在form子句中使用子查询时,该子查询会被作为一个视图来对待,因此叫做内嵌视图,当在form字句中使用子查询时,必须给子查询指定别名。


给表取别名的时候不能加as;


给列取别名的时候可以加as,也可以不加as;


.分页查询


·Oracle的分页一共有3种方式:rownum, ROWID


1.rownum分页


执行时间为0.1秒,速度比ROWID次之

select a1.*,rownum rn from
  (select * from emp) a1;


sql语句解析:


(select * from emp) 内嵌视图 取个别名a1


a1.* 表示把子查询的信息再读取出来


rownum 是Oracle给它分配的


rn 相当于Oracle给每一行分配的一个行号


(这个行号是变化的,而不是固定的)


(rownum的别名)


显示前十条数据

select al.*,rownum rn from(select * from emp ) a1 where rownum<=10;

显示第六条到第十条数据(用二分机制)

select * from (select a1.*,rownum rn from (select * from emp) a1 where rownum<=10) where rn>=6;

·几个查询变化


&指定查询列,只需修改最里边的子查询

select * from (select a1.*,rownum rn from (select enamel,sale from emp) a1 where rownum<=10) where rn>=6;


如何排序


对某薪水列排序后取第6条到第10条

select * from (select a1.*,rownum rn from (select ename,sal from emp order by sal desc) a1 where rownum<=10) where rn>=6;

显示第4条到第9条的记录

select * from (select a1.*,rownum rn from (select ename,sal from emp order by sal desc) a1 where rownum<=9) where rn>=4;

**2.根据ROWID来分 **

select * from t_xiaoxi where rowid in(select rid from (select rownum rn,rid from(select rowid rid,cid from t_xiaoxi order by cid desc) where rownum<10000) where rn>9980) order by cid desc;


执行时间0.03秒,速度快,较复杂


3.按分析函数来分

select * from (select t.*,row_number() over(order by cid desc) rk from t_xiaoxi t)where rk<10000 and rk>9980;

执行时间为1.01秒,速度最慢


·用查询结果创建新表


这个命令是一种快捷的建表方法

create table mytable(id,name,sal,job,deptno) as select empno,ename,sal,job,deptno from emp;



相关文章
|
6月前
|
消息中间件 关系型数据库 Kafka
实时计算 Flink版产品使用合集之oracle cdc 抽取新增一张表 可以从savepoint恢复吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
4月前
|
SQL Oracle 关系型数据库
关系型数据库Oracle并行查询
【7月更文挑战第12天】
103 15
|
4月前
|
Oracle 关系型数据库 数据处理
|
4月前
|
SQL 监控 Oracle
|
4月前
|
SQL 监控 Oracle
|
5月前
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用问题之oracle无主键的表支持同步吗如何实现
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
5月前
|
运维 DataWorks Oracle
DataWorks产品使用合集之在标准模式下,当同步Oracle的表或视图时,是否需要在源端的测试和生产环境中都存在要同步的表或视图
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
44 3
|
6月前
|
资源调度 Oracle 关系型数据库
实时计算 Flink版产品使用合集之同步Oracle数据时,一张表产生了大量的连接数,如何处理
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
6月前
|
分布式计算 DataWorks 关系型数据库
DataWorks产品使用合集之在 DataWorks 中,使用Oracle作为数据源进行数据映射和查询,如何更改数据源为MaxCompute或其他类型
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
71 1
|
6月前
|
SQL 存储 Oracle
Oracle中的Dual表:数据世界的“神奇小盒子”
【4月更文挑战第19天】Oracle的Dual表是一个虚拟表,仅含一行一列,常用于执行SQL函数、数据类型转换、测试语句和动态SQL。它是测试和便捷操作的工具,如获取当前日期(`SELECT SYSDATE FROM DUAL`)、数字转字符串(`SELECT TO_CHAR(12345) FROM DUAL`)。在存储过程、函数和触发器中也发挥重要作用,是数据库管理员的得力助手。

推荐镜像

更多