Oracle 子查询1

--1.子查询的使用形式
--2.子查询的主要意义
--1.概念
--子查询是指在一个查询中继续嵌套其他的查询语句;

--2.使用方法:

--出现where 子句上
   子查询一般返回单行单列,单行多列,多行单列数据;
--出现在having子句上:
  子查询会返回单行单列,同时表示要使用统计函数;
---出现在From子句上:
 子查询返回多行多列数据(表结构)
--select子句上

   返回单行单列,一般不使用;

1.where子句:数据行的筛选;
---查询低于公司平均水平的员工信息(where 子句返回单行单列)
    select * from emp where sal<(select  avg(sal) from emp e);
---查询最早雇佣的员工(where 子句返回单行单列)
   select * from emp e where e.hiredate = (select min(hiredate) from emp)
---查询和scott从事同一工作,且工资相同的雇员信息(where子句返回单行多列,实际中很少使用)
  select * from emp 
  where (job,sal)=(select job,sal from emp where ename='SCOTT') and    ename!='SCOTT'
 
 如果子查询返回的内容是多行单列的话就表示一个操作数据的范围;
对应此类的操作 SQL提供了三个操作符 in ,any,all

1.IN操作:指的是与子查询返回的内容完全相同;
select sal from emp where sal in( select sal from where job='MANAGER')

NOT IN 操作;
select sal from emp( select sal from where job='MANAGER');
如果使用的是NOT IN ,子查询中不能放回null,如果返回了null
不会返回任何数据;

select * from emp where empno not in (select mgr From emp);
2.any 操作
1.=any
  功能和in一样
    SELECT * FROM WHERE sal=any(
    select sal from emp where job='MANAGER')
2.>any

  比子查询返回的最小值要大
  SELECT * FROM WHERE sal>any(
  select sal from emp where job='MANAGER')

3.<any

   比子查询返回的最大值要小;
   SELECT * FROM WHERE sal<any(
  select sal from emp where job='MANAGER')
 
4.ALL
1.>all:比子查询返回的最大值要大
SELECT * FROM WHERE >all(
 select sal from emp where job='MANAGER')
2.<all:比子查询返回的最小值要小
SELECT * FROM WHERE <all(
 select sal from emp where job='MANAGER')

2.在Having中使用子查询

    一般返回单行单列的数据只在where和having语句中出现;
    --查询高于公司平均工资的的职位名称,职位人生,平均工资
   select job,count(*) count,avg(sal) avgsal
   from emp 
  group by job 
  having avg(sal)>(select avg(sal)from emp);

3.--- 在select中使用子查询一般不使用

--会产生1+N次查询问题(每次查询一条数据读取查询下dept表) 一般不使用影响性能;​​​​​​​
  查询每个雇员的姓名,职位,部门名称
  select e.ename,e.job,(select d.dname from dept d where d.deptno=e.deptno  )
 from emp e;
 

4.在From子句中的子查询
 1.如果子查询返回的是多行多列的而数据,
 那么就相当于是一张临时表的形式,所以可以直接在From子句中使用;
 
-- 查询出每个部门名称,位置,部门人数 
 select d.dname,d.loc,count(*)
 from emp e,dept d where e.deptno=d.deptno
 group by d.dname,d.loc
 select d.deptno,d.dname,d.loc from dept d; 
 select deptno, count(*) from emp e group by deptno;
 
 select  d.dname,d.loc,e.count from dept d ,(select deptno, count(*) count from emp e group by deptno) e where e.deptno=d.deptno(+);

 1.子查询和普通查询的区别
 1.如果emp表中有2000条数据,dept有400条数据
  使用多表查询及分组统计
  emp表中的2000*dept表中的400=800000条记录;
  使用子查询
   子查询的数据量:emp表中的2000条记录,最多返回400行记录
   子查询的数据量400*dept表中的400=160000行记录
   两个操作加在一起最多产生160000条记录
   
   在实际的工作中,子查询的目的是解决多表查询所带来的性能问题;
   在开发中使用的是最多的;

   
   在from子句中出现子查询的另一种情况
    在整个查询语句之中需要使用到统计函数,但是又无法直接使用统计函数统计的时候, 可以先在From子句中利用子查询实现统计;

总结
     子查询,首先考虑的一定是where子句或from子句里面出现子查询的操作
     select基本不用,having子句出现的子查询只有在使用统计函数的时候才会使用;
     子查询最大的作用是解决多表查询所带来的笛卡儿积影响的性能的问题;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值