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

2年前Python源码18484
6-5 Oracle表复杂查询 -子查询 鲁班七号学测开(HanYanHua) 于2022-10-02 22:14:01发布 559 收藏 2 分类专栏: 软件开发工程师 # Oracle从入门到精通 文章标签: oracle 数据库 sql Oracle 子查询 软件开发工程师 同时被 2 个专栏收录 33 篇文章 0 订阅 订阅专栏 Oracle从入门到精通 19 篇文章 0 订阅 订阅专栏

CSDN话题挑战赛第2期 参赛话题:学习笔记

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

1 Oracle 基础知识3 Oracle 基本使用4 Oracle 用户管理6 -1Oracle 表的管理-创建修改表6-2 Oracle 表的管理-表查询6-3 Oracle 表的管理-表复杂查询6-4 Oracle表复杂查询 -多表查询89

文章目录 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;

相关文章

SSRF漏洞原理攻击与防御(超详细总结)

SSRF漏洞原理攻击与防御(超详细总结)...

考研心得:考研数据结构算法大全

考研心得:考研数据结构算法大全...

Ubuntu20.04安装详细图文教程(双系统)

Ubuntu20.04安装详细图文教程(双系统)...

2021年长安杯电子数据取证比赛复盘完整版(wp)

2021年长安杯电子数据取证比赛复盘完整版(wp)...

2022MySQL 8.0.30 安装及配置(详细教程)

2022MySQL 8.0.30 安装及配置(详细教程)...

Linux安装教程(超详细版)

Linux安装教程(超详细版)...