oracle03--子查询,SQL-Oracle03-子查询

子查询:

在一个查询的内部还包含另外一个查询

可在任意地方加入子查询代码,放在"()"中

eg:查询出比7654工资要高的全部雇员的信息。

首先清楚7654雇员的工资是多少

SELECT sal FROM emp WHERE empno=7654 ;

之后要以以上结果作为查询依据,只要是其他的工资大于sal,则表示

符合条件。

SELECT * FROM emp;

FROM sal>(SELECT sal FROM emp WHERE emp=7654) ;

子查询在操作中有分为以下三类:

单列子查询:返回的结果是一列的一个内容,出现几率高

单行子查询:返回多个列,有可能是一条完整的记录

多行子查询:返回多条记录

eg:查询出工资比7654高,同时与7788从事相同工作的全部雇员信息。

查询出7654的工资:

SELECT sal FROM emp WHERE emp=7654;

选出7788雇员的工作

SELECT job FROM emp WHERE empno=7788;

之后把两个条件进行综合查找

SELECT * FROM emp

WHERE sal>(SELECT sal FROM emp WHERE empno=7654)

AND job=(SELECT job FROM emp WHERE empno=7788) ;

eg:要求查处工资最低的雇员的姓名、工作、工资

SELECT MIN(sal) FROM emp;

SELECT * FROM emp

WHERE sal=(SELECT MIN(sal) FROM emp) ;

思考:

要求查询出部门的部门名称、部门的员工数、部门的平均工资,

部门的最低收入雇员的姓名和最高收入、雇员的姓名。

程序需要两张表关联:dept、emp

1、要求出每个部门的员工数,平均工资,则肯定要使用分组统计,按照deptno

进行分组,

SELECT deptno,COUNT(empno),AVG(sal)

FROM emp

GROUP BY deptno;

2、但是如果要想查出来部门的名称则需要与dept表进行关联。

SELECT d.dname,ed.c,ed.a

FROM dept d,

(SELECT deptno,COUNT(empno) c,AVG(sal) a

FROM emp GROUP BY deptno) ed;

WHERE d.deptno=ed.deptno ;

3、求出最低收入的雇员的姓名

SELECT d.dname,ed.c,ed.a,e.ename

FROM dept d,(

SELECT deptno,COUNT(emp) c,AVG(sal) a,

MIN(sal) min,MAX(sal) max

FROM emp

GROUP BY deptno) ed,emp e

WHERE d.deptno = ed.deptno AND e.sal=ed.min;

如果,在一个部门中同时存在两个工资最低的雇员,则程序就会出现错误。

在子查询中,存在三种查询操作符号:

IN 指定一个查询范围

ANY

ALL

IN 指定一个查询范围

eg:求出每个部门的最低工资的雇员信息

每个部门的最低工资返回的值肯定是多个,所以此时可以使用IN指定一个操作的范围。

WHERE * FROM emp

WHERE sal IN(select MIN(sal) FROM emp GROUP BY deptno) ;

ANY操作:

=ANY :与IN的操作符功能完全一样

SELECT * FROM emp

WHERE sal>ANY(SELECT MIN(sal) FROM emp GROUP BY deptno) ;

>ANY :比里面最小的值要大

SELECT * FROM emp

WHERE sal

>ALL :比最大的值要大的

>ALL :比最小的值要小的

SELECT * FROM emp

WHERE sal>ALL(SELECT MIN(sal) FROM emp GROUP BY deptno) ;

对于子查询来讲,还可以进行多列子查询,一个子查询中同时返回多个查询的列。

SELECT * FROM dept

WHERE (sal.NVL(comm,-1)) IN (

SELECT sa,NVL(comm,-1) FROM emp WHERE deptno=20)

;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle SQL 中,子查询是一个查询嵌套在另一个查询中的查询子查询可以用于过滤数据、计算聚合值、连接表等操作。为了优化子查询的性能,可以考虑以下几点: 1. 使用合适的子查询类型:Oracle 提供了多种子查询类型,包括标量子查询、单行子查询、多行子查询等。选择最适合需求的子查询类型可以提查询效率。 2. 使用 EXISTS 替代 IN 子查询:在某些情况下,使用 EXISTS 关键字替代 IN 子查询可以提查询性能。EXISTS 只需要判断是否存在匹配记录,而不需要返回具体的匹配记录。 3. 使用合适的连接方式:当使用子查询与外部查询进行连接时,可以考虑使用合适的连接方式(如 INNER JOIN、LEFT JOIN 等)。根据数据量和索引情况选择合适的连接方式可以提查询性能。 4. 使用合适的索引:为了加快子查询的执行速度,可以通过创建合适的索引来优化查询。根据子查询中涉及的列,创建适当的索引可以减少数据访问的次数。 5. 注意子查询的返回结果集大小:如果子查询返回的结果集较大,在性能方面可能会有一定的影响。可以考虑优化子查询或使用其他方法来处理大数据量的情况。 6. 使用合适的限制条件:在子查询中使用合适的限制条件可以缩小结果集的大小,从而提查询效率。 7. 避免多层嵌套的子查询:多层嵌套的子查询可能会导致性能下降,可以尝试重构查询语句,减少子查询的嵌套层数。 8. 使用临时表或内联视图:在某些情况下,将子查询的结果保存到临时表或使用内联视图可以提查询性能。 以上是一些常见的优化子查询的方法,具体的优化策略还需要根据实际情况进行分析和调整。同时,可以使用 Oracle 提供的性能调优工具(如 Explain Plan、SQL Trace 等)来分析查询执行计划和性能瓶颈,帮助进一步优化子查询的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值