子查询

子查询

子查询就是把一个查询的结果集,作为另外一个查询的条件使用

  • 子查询作为条件
  • 子查询当做表使用

子查询作为条件

-- 查出跟SCOTT在同一个部门工作的所有员工的信息
SELECT *
FROM EMP
WHERE DEPTNO = (
         SELECT E.DEPTNO
         FROM EMP E
         WHERE E.ENAME='SCOTT');  --先查询出SCOTT所在的部门

在这里插入图片描述

-- 查询出工资高于全公司平均工资的员工的信息
SELECT *
FROM EMP 
WHERE SAL > (SELECT AVG(SAL) FROM EMP E) --先查询出全公司的平均工资

子查询当做表使用

  • 伪列
  1. ROWNUM 逻辑上存在序号自动增加的列
  2. ROWID 物理地址,表中的数据,存在数据库磁盘中的位置
SELECT * ,ROWNUM  ,ROWID 
FROM EMP
WHERE ROWNUM <= 5 ;

建TESTA表测试

CREATE TABLE TESTA(A_ID NUMBER);

SELECT *,ROWID 
FROM TESTA;

--找出TESTA表中的唯一记录
--方法一 DISTINCT
SELECT DISTINCT A_ID 
FROM TESTA; --只能找出唯一值,但是不能找出重复的记录
--方法二 GROUP BY
SELECT A_ID
FROM TESTA
GROUP BY A_ID;--可以找出唯一值,但是找重复记录的时候,会包含唯一的值
--方法三 ROWID
SELECT A_ID
FROM TESTA
WHERE ROWID IN (
      SELECT MAX(ROWID) 
      FROM TESTA
      GROUP BY A_ID); -- MAX(ROWID)为最新的数据,MIN(ROWID)为最原始的数据

--找出TESTA表中的重复记录,不包含唯一值
--使用方法二 
SELECT A_ID
FROM TESTA
GROUP BY A_ID
HAVING COUNT(*)>1;
--使用方法三
SELECT A_ID
FROM TESTA
WHERE ROWID NOT IN (
      SELECT MAX(ROWID)
      FROM TESTA
      GROUP BY A_ID);
 -- 查询出工资排名 第5~10的员工
 SELECT F.*
 FROM (SELECT E.*,ROWNUM RN   --给排序过后的工资进行ROWNUM伪列
       FROM (SELECT *    
             FROM EMP
             ORDER BY SAL DESC) E  --先将工资由高到低进行排序
             ) F
 WHERE F.RN BETWEEN 5 AND 10;  

子查询什么时候使用

  1. 当条件不明确的时候,子查询作为条件
  2. 当条件不满足,我们可以通过子查询查出我们想要的结果集,把子查询当做表使用

子查询返回结果的几种形式

  • 子查询返回单行
--查出最高工资的员工的信息
SELECT *
FROM EMP
WHERE SAL = ( SELECT MAX(SAL) 
              FROM EMP); 
  • 子查询返回多行
--找出员工表中所有的领导 (MGR)
SELECT * 
FROM EMP 
WHERE EMPNO IN (SELECT MGR 
                FROM EMP );
  • 子查询返回多行多列(类似表)
 -- 查询跟SCOTT 岗位相同,部门也相同的所有员工
 --方法一
SELECT *
FROM EMP
WHERE DEPTNO =(SELECT DEPTNO FROM EMP WHERE ENAME='SCOTT') --SCOTT所在的部门
      AND JOB =(SELECT JOB FROM EMP WHERE ENAME='SCOTT'); --SCOTT的岗位
 --方法二
 SELECT * 
 FROM EMP E
 WHERE (E.DEPTNO ,E.JOB) = (SELECT DEPTNO ,JOB 
                            FROM EMP 
                            WHERE ENAME = 'SCOTT');
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值