12.Oracle 高级查询-子查询

本文详细介绍了Oracle数据库中子查询的使用,包括将查询结果作为基表再次查询、与其他查询或表联合,以及单值和多值子查询的应用。子查询虽然灵活,但可能影响性能。示例展示了如何查找薪水超过特定雇员、部门薪资差距超过一定值的雇员信息。同时,讨论了子查询性能优化和不同类型的子查询,如单值和多行单列子查询的比较和用法。
摘要由CSDN通过智能技术生成

Oracle 高级查询-子查询

将一个查询结果作为基表再次进行查询,或者是将查询结果作为基表再和其他查询结果或者表再次联合!

子查询最为灵活,可以实现前面很多条件、投影、联合等查询!

但是,性能不高,对于书写要求高!

子查询的两种利用方式

  1. 将一个查询结果作为基表再次进行查询

select * from (select * from emp where deptno = 10) where job = 'MANAGER';

-- 外层查询的列和条件是在子查询的结果集上进行的(所以列名以子查询结果的列定义为准)
select t.empno, t.ename, t.sal, t.job_name from
    (select empno, ename, sal, job job_name from emp where deptno = 10) t
        where t.job_name = 'MANAGER';
select * from
    (select min(sal) min_sal, max(sal) max_sal, deptno
        from emp
            where sal >= 1000
                group by deptno)
                    where max_sal - min_sal > 2000;
  1. 将查询结果作为基表再和其他查询结果或者表再次联合
-- 求部门薪水差距超过2000的部门信息(名称、工作地)

select t.*, d.*
    from
        (select * from
            (select min(sal) min_sal, max(sal) max_sal, deptno
                from emp
                    where sal >= 1000
                        group by deptno)
                            where max_sal - min_sal > 2000
        ) t join dept d
            on t.deptno = d.deptno;

单值子查询

如果子查询的结果只有一行一列,那么该子查询的结果可以被作为一个值对待!

-- 查询薪水比FORD高的雇员
select * from emp where sal > (select sal from emp where ename = 'FORD');

-- 将SMITH的薪水改为和FORD一样
update emp
    set sal = (select sal from emp where ename = 'FORD')
        where ename = 'SMITH';

注意:返回结果必须是一行一列,否则报错

多值子查询

  • 返回多行多列
-- 求每个部门内的最低薪水(返回部门编号和薪水值)
select deptno, min(sal)
    from emp
        group by deptno;

-- 求每个部门拿最低薪水的雇员信息
-- 两种写法:
-- 1、
select e.* from
    emp e join (
        select deptno, min(sal) min_sal
            from emp
                group by deptno
        ) t on e.deptno = t.deptno and e.sal = t.min_sal;

-- 2、
select * from emp where (deptno, sal) in (
                                            select deptno, min(sal)
                                                from emp
                                                    group by deptno);
select * from emp where (deptno, sal) =any (
                                            select deptno, min(sal)
                                                from emp
                                                    group by deptno);
  • 返回多行单列

>all 大于一组值中的最大值
>any 比一组值中最小的值大
<all 小于一组值中的最小值
<any 比一组值中最大的值小

-- 查询比10号部门所有人薪水都要高的公司雇员
select * from emp where sal >all (select sal from emp where deptno  = 30);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值