ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [MySQL/2일차] 서브쿼리
    데이터베이스 DB/MySQL 2023. 1. 25. 14:10

    서브쿼리

    하나의 sql문 안에 다른 sql문이 중첩된 형태

    -- 서브쿼리 --
    -- JONES 보다 급여가 높은 사원 조회 -- 
    select * 
    from emp
    where sal > (select sal from emp where ename='JONES');

     

    단일행 서브쿼리

    실행 결과가 단 하나의 행인 서브쿼리

    -- blake보다 입사가 빠른 회원 목록 -- 
    select *
    from emp
    where hiredate < (select hiredate from emp where ename='BLAKE');
    
    /* 20번 부서에 속한 사원 중 전체 사원의 평균 급여보다 높은 급여를 받는 
      	사원 정보와 소속 부서 정보 함께 조회하기 */
    select e.empno, e.ename, e.job, e.sal, d.deptno, d.dname, d.dname, d.loc
    from emp e
    inner join dept d
    on e.deptno = d.deptno
    where e.deptno = 20
    	and e.sal > (select avg(sal) from emp);

     

    다중행 서브쿼리

    실행 결과 행이 여러 개인 서브쿼리

     

    in

    -- 각 부서 별 최고 급여를 받는 사원 조회 -
    select * 
    from emp
    where sal in(select max(sal) from emp group by deptno);

     

    any / some - 서브쿼리의 모든 결과 중 하나만 true여도 true

    -- 각 부서 별 최고 급여를 받는 사원 조회 -
    select * 
    from emp
    where sal = any(select max(sal) from emp group by deptno);
    
    select * 
    from emp
    where sal = some(select max(sal) from emp group by deptno);
    -- 30번 부서 사원들의 최대 급여보다 적은 급여를 받는 사원 정보 --
    select * 
    from emp
    where sal < any(select sal from emp where deptno=30);

     

    all - 서브쿼리의 모든 결과가 true여야 true

    -- 부서번호가 30인 사원들의 최소 급여보다 더 적은 급여를 받는 사원 출력 --
    select *
    from emp
    where sal < all(select sal from emp where deptno=30);

     

    exists - 서브쿼리의 결과 값이 하나 이상 존재하면 조건식이 모두 true, 존재하지 않으면 모두 false

    -- 부서번호가 10인 사원을 조회하였고, 10인 사원이 존재하므로 모든 사원의 정보 출력 --
    select * 
    from emp
    where exists(select dname from dept where deptno=10);

     

    from 절에 사용하는 서브쿼리 Inline view

    -- 10번부서 사원들의 정보 -- 
    select e10.empno, e10.ename, e10.deptno, d.dname, d.loc
    from (select * from emp where deptno=10) e10
    inner join (select * from dept) d

    select 절에 사용하는 서브쿼리 scalar subquery

    select 
    empno, ename, job, sal,
    (select grade from salgrade where e.sal between losal and hisal) as 'salgrade', 
    deptno
    from emp e;

     

     

    연습문제

    /* 서브쿼리를 이용하여 emp 테이블의 사원 중에 10번 부서에 속한 
    모든 사원들보다 일찍 입사한 사원 */
    select *
    from emp
    where hiredate < all(select hiredate from emp where deptno=10);

     

Designed by Tistory.