Oracle数据库---------------------------------子查询

本文详细介绍了Oracle数据库中子查询的使用,包括在WHERE、HAVING、SELECT和FROM子句中的应用。通过实例展示了如何利用子查询进行数据筛选、统计分析以及多表关联查询。重点讲解了子查询返回单行单列、单行多列和多行单列数据的情况,以及与IN、ANY、ALL操作符的结合使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Oracle数据库的学习记录:

二十、子查询
对于整个的SQL语法而言,所有的组成就是几个固定的查询语句:SELECT、FROM、GROUP BY、HAVING、ORDER BY、HAVING、ORDER,所谓的子查询就是在一个查询里面继续嵌套其他的查询语句
在一个查询语句之中有可能会同时嵌套多个子查询
**WHERE子句:子查询一般会返回单行单列、单行多列、多行单列数据
**HAVING子句:子查询会返回单行单列,同时表示要使用统计函数
**FROM子句:子查询返回多行多列数据(表结构)

1.在WHERE子句里面使用子查询
WHERE子句的作用是进行数据行的筛选操作的
范例:查询出低于公司平均工资的雇员信息
**应该先统计出公司的平均工资
SELECT AVG(sal) FROM emp;
以上的查询返回单行单列,可以作为WHERE子句使用的过滤条件
SELECT * FROM emp WHERE sal < (
                    SELECT AVG(sal) FROM emp)
范例:查询出公司最早雇佣的雇员信息
**使用MIN()函数找到最早雇用日期
SELECT MIN(hiredate) FROM emp;
SELECT * FROM emp WHERE hiredate=(
                    SELECT MIN(hiredate) FROM emp);
单行多列
范例:与SCROTT从事同一工作,并且工资相同的雇员信息
**首先应该知道SCOTT的工作和工资
SELECT job sal FROM emp WHERE ename='SCOTT';
SELECT * FROM emp WHERE (job,sal)=(
                      SELECT job sal FROM emp WHERE ename='SCOTT') AND ename<>'SCOTT';
这种一般不会用

如果说子查询返回的内容是多行单列的话那么就表示一个操作的数据范围,对于此类的操作在SQL语句中提供有3个操作符:IN、ANY、ALL
|-IN操作:指的是与子查询返回的内容相同
SELECT sal FROM emp WHERE job='MANAGER';
SELECT * FROM WHERE sal IN (
                    SELECT sal FROM emp WHERE job='MANAGER');
此过程与最早的IN操作完全相同,唯一的区别在于IN的范围是自己设置的,而此时的范围是子查询来的
有NOT IN,但是子查询里面不能为空

|-ANY操作,一共分为3中形式:
=ANY:功能与IN操作一样
SELECT * FROM WHERE sal =ANY (
                    SELECT sal FROM emp WHERE job='MANAGER');
>ANY:比子查询的最小值要大
SELECT * FROM WHERE sal >ANY (
                    SELECT sal FROM emp WHERE job='MANAGER');
<ANY:比子查询的最大值要小
SELECT * FROM WHERE sal <ANY (
                    SELECT sal FROM emp WHERE job='MANAGER');
在实际的开发之中,WHERE子句中出现子查询的几率是很高

2.在HAVING子句里面使用子查询
如果子查询可以在HAVING子句里面出现,那么只有一种情况,子查询返回的是单行单列,并且需要进行统计函数计算的时候
查询:查询出高于公司平均工资的职位名称、职位人数、平均工资
SELECT AVG(sal) FROM emp;
SELECT job,COUNT(empno),AVG(sal) FROM emp GROUP BY job HAVING AVG(sal)>(
                    SELECT AVG(sal) FROM emp);
在进行HAVING操作的过程之中,子查询返回的数据不会过于复杂

3.在SELECT子句里面使用子查询(一般不会用)
范例:
SELECT e.empno,e.ename,e.job,(SELECT d.dname  FROM dept d WHERE d.deptno=e.deptno) FROM emp e;

4.在FROM子句里面使用子查询(重点)
范例:查询出每个部门的名称、位置、部门人数
**多表查询:
SELECT d.dname,d.loc,COUNT(e.empno) FROM emp e,dept d WHERE e.deptno(+)=d.deptno GROUP BY d.dname,d.loc;
**子查询:
|-查询出部门的编号、名称、位置,次查询只需要dept一张表就够了
SELECT d.deptno,d.dname,d.loc FROM dept d;
|-统计出每个部门的编号、人数,只需要emp表
SELECT deptno,COUNT(dempno) FROM emp GROUP BY deptno;
|-以上的两个数据发现可以在部门编号上找到联系
SELECT d.deptno,d.dname,d.loc FROM dept d,(
                SELECT deptno,COUNT(dempno) count FROM emp GROUP BY deptno) temp
WHERE d.deptno=temp.deptno(+);

复杂查询=简单查询+限定查询+查询排序+多表查询+分组统计查询+子查询

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值