oracle基础知识5_子查询

 

0 概念: 主查询之前的查询,作为结果服务于主查询。

            解决的问题: 不能一步求解

单行子查询: 返回的结果是一条记录

多行子查询: 返回的结果是两条和两条以上的记录

 

1 要注意的问题:


 1. 括号
 2. 合理的书写风格
 3. 可以主查询的where/ select/ from/ having后面放置子查询, 如果是在select后,那么这个查询必须是单行子查询
 4. 不可以在主查询的group by后面放置子查询
 5. 强调from后面的子查询
 6. 主查询和子查询可以不是同一张表,只要子查询返回的结果 主查询可以使用即可
 7. 一般不在子查询使用order by,但在Top-N分析问题中 必须使用order by
 8. 一般先执行子查询,再执行主查询;但相关子查询除外
 9. 单行子查询只能使用单行操作符 多行子查询只能使用多行操作符
 10. 子查询中null

 

2 案例:

 

2.1 在主查询select后跟子查询

select ename,sal,(select job from emp where empno=7839) as jobname   from emp;

 

ENAMESALJOBNAME
Tom_ABCD6000PRESIDENT
SMITH800PRESIDENT
ALLEN1600PRESIDENT
WARD1250PRESIDENT

 

 

2.2 在主查询from后跟子查询

select *  from (select ename,sal,sal*12 annlsal from emp)

 

ENAMESALANNLSAL
Tom_ABCD600072000
SMITH8009600
ALLEN160019200
WARD125015000

 

 

 

3 多行子查询用到的操作符:

操作符含义
IN等于列表中的任何一个
ANY和子查询返回的任意一个数值比较
ALL和子查询返回的所有数值比较

 

查询部门名称是SALES和ACCOUNTING的员工

select *
    from emp
    where deptno in (select deptno from dept where dname='SALES' or dname='ACCOUNTING');

 

查询工资比30号部门任意一个员工高的员工信息

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

 

查询工资比30号部门所有员工高的员工信息

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

等同于:

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

 

 

 在员工表中查询本身是领导的员工信息(是领导表示自己主键编码在领导编码mgr中出现)

    from emp
    where empno in (select mgr from emp);

 

 

 在员工表中查询本身不是领导的员工信息(子查询not in中需要排除null)

select *
  from emp
  where empno not in (select mgr from emp where mgr is not null)

EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO
7844TURNERSALESMAN769808-9月 -811500030
7521WARDSALESMAN769822-2月 -81125050030
7654MARTINSALESMAN769828-9月 -811250140030

 

子查询中的Null问题:

 

a) 所有和空值比较的函数都返回一个空值,

b) 只要子查询中包含一个空值,那么请不要使用not in操作,

c) 如果用的话,操作等同于 <>all

 

a not in(100,20,null) --->  等同于   a!= 100 and a!= 20 and a!=all

因此 not in的子查询中要排除空值,否则不会得到任何数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值