[DataBase] 실행 결과가 여러 개인 다중행 서브쿼리

 다중행 서브쿼리 


다중행 서브쿼리는 실행 결과 행이 여러 개로 나오는 서브쿼리를 가리킵니다 . 
단일행 서브쿼리와는 다르게 서브쿼리 결과가 여러 개 이므로 단일행 연산자는 사용할 수 없고 다중행 연산자를 사용해야 메인 쿼리와 비교할 수 있습니다 . 

 

다중행 연산자

설명

IN

메인 쿼리의 데이터가 서브쿼리의 결과중 하나라도 일치한 데이터가 있다면 TRUE

ANY, SOME

메인 쿼리의 조건식을 만족하는 서브쿼리의 결과가 하나이상이면 TRUE

ALL

메인 쿼리의 조건식을 서브쿼리의 결과 모두가 만족하면 TRUE

EXISTS

 서브쿼리의 결과가 존재하면 (행이 1개 이상일 경우)TRUE




IN연산자 사용

  • 각 부서별 최고 급여와 동일한 급여를 받는 사원 정보 출력  
SELECT * FROM EMP
  WHERE SAL IN (SELECT MAX(SAL)
                  FROM emp  
                GROUP BY DEPTNO);







ANY, SOME 연산자 

  • ANY 의 사용
SELECT * FROM EMP
  WHERE SAL = ANY (SELECT MAX(SAL)
                      FROM EMP
                    GROUP BY DEPTNO);







  • SOME의 사용
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)
ORDER BY SAL, EMPNO;







ANY 연산자는 서브쿼리 결과 값 중 최소한 하나의 값이 조건식에 만족하면 메인 쿼리 조건식의 결과가 TRUE 가 됩니다 .
이경우에 서브 쿼리에서 가장 큰 값인 2850 보다 적은 급여를 가진 메인쿼리 행은 모두 TRUE입니다. 


ALL 연산자 사용

앞서 살펴본 조건식과 다르게 모든 결과가 조건식에 맞아 떨어저야 메인쿼리의 조건식이 TRUE가 됩니다 . 

부서 번호가 30번인 사원들의 최소 급여보다 적은 급여를 받는 사원 출력 
SELECT * FROM EMP
  WHERE SAL < ALL (SELECT SAL
                      FROM EMP
                    WHERE DEPTNO=30)





ALL 연산자가 의미 하는것과 같이 서브쿼리의 모든 결과값 보다 작은 값을 가진 메인 쿼리만 출력 됩니다 . 


EXISTS 연산자

서브쿼리에 결과 값이 하나 이상 존재하면 조건식이 모두 TRUE 존재하지 않으면 모두 FALSE입니다 . 

서브쿼리에 결과 값이 존재 
SELECT * FROM EMP
  WHERE EXISTS (SELECT DNAME
                      FROM DEPT
                    WHERE DEPTNO=10)














서브쿼리 결과 값이 존재하지 않음
SELECT * FROM EMP
  WHERE EXISTS (SELECT DNAME
                      FROM DEPT
                    WHERE DEPTNO=50)