ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SQL] SUB QUERY ( 서브 쿼리)
    Database/SQL (oracle, mysql) 2019. 5. 28. 16:18

    SUB QUERY (서브 쿼리) 

    SELECT DNAME <-메인쿼리 , 1행 1열

    FROM DEPT <- DEPT에서 서브쿼리가 들어갈 수 있다. 다행다열 = VIEW ( 왜? 테이블이니까 )  

    WHERE DEPTNO = (SELECT 절)  <- 서브 쿼리

     

    서브 쿼리가 들어가는 조건은: 1개의 열 1개의 행이다.

     

    다중행 서브쿼리도 존재한다. (Multi Row Operator)

    - 서브쿼리에서 반환되는 결과가 두개 이상의 행일 때 사용하는 서브 쿼리

    - 반드시 다중 행 연산자와 함께 사용.

     

    IN  ANY, SOME  ALL  EXISTS

    IN: 메인 쿼리의 비교 조건이 서브 쿼리의 결과중에서 하나라도 일치하면 참

         WHERE DEPTNO IN ( SELECT DEPTNO FROM DEPT WHERE DEPTNO<30 ) <- 결과가 여러개일때

     

    ANY, SOME: 메인 쿼리의 비교조건 (WHERE절) 서브쿼리의 결과와 하나 이상 일치하면 참 ( =OR )

         WHERE SAL < ANY (SELECT SAL FROM EMP WHERE DEPTNO =20 ) -- 20 번 부서의 최소급여보다 많은 급여 받는 

         

    ALL: 메인 쿼리의 비교조건이 서브쿼리의 결과와 모든 값이 일치 하면 참 (= AND)

         WHERE SAL < ALL (SELECT SAL FROM EMP WHERE DEPTNO =20 ) -- 20번부서 최대 급여보다 많이 받는


    ALL과 ANY의 차이점

     select ename, sal
         from   emp
         where  sal   >= all(select sal
                          from emp
                          where ename='SCOTT');   ---> 3000 이상의 사원정보
               
               -------------------------ANY---------------------------
                          만약 서브쿼리 결과 : 2500 2800  3000
                where sal   >=  any (2500, 2800, 3000)
                
                ==>  sal >= 2500 OR  sal >= 2800  OR sal >= 3000                
               -------------------------ALL---------------------------
                          만약 서브쿼리 결과 : 2500 2800  3000
                where sal   >=  all (2500, 2800, 3000)
                
                ==>  sal >= 2500 AND  sal >= 2800  AND sal >= 3000
               ------------------------- IN --------------------------
                          만약 서브쿼리 결과 : 2500 2800  3000
                where sal   IN (2500, 2800, 3000)
                
                ==>  sal = 2500 OR  sal = 2800  OR sal = 3000    
               ------------------------------------------------------- 


    EXISTS: 메인 쿼리의 비교조건이 서브쿼리의 결과중에서 만족하는 값이 하나라도 존재하면 참.

              데이터 존재 유무에 따라 SELECT, DELETE, UPDATE, INSERT시 제어하는 역할로 사용된다.

               사용법) WHERE EXISTS (서브쿼리)

                         WHERE NOT EXISTS (서브쿼리)

               ex. SELECT * FROM DEPT WHERE EXISTS (SELECT * FROM EMP) <-서브 쿼리 결과가 1행 이상이면 TRUE

               SELECT * FROM DEPT WHERE EXISTS (SELECT * FROM EMP WHERE 1=0); <- 결과가 FALSE면 실행을 안한다.

     

     

     

     

    반응형

    댓글

Designed by Tistory.