Database/SQL (oracle, mysql)

[SQL] SUB QUERY ( 서브 쿼리)

jinsiri 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면 실행을 안한다.

 

 

 

 

반응형