DB/Oracle

[서브쿼리] 다중행 서브쿼리

각시탈코더 2022. 2. 15. 15:18

다중행 서브쿼리

 다중행 서브쿼리는 실행 결과 행이 여러 개 나오는 서브쿼리입니다. 다중행 서브쿼리에 사용되는 연산자는 아래와 같다.

 

 

다중행 연산자 설명
IN 메인쿼리의 데이터가 서브쿼리의 결과 중 하나라도 일치한 데이터가 있다면 true
ANY, SOME 메인쿼리의 조건식을 만족하는 서브쿼리의 결과가 하나 이상이면 true
ALL 메인쿼리의 조건식을 서브쿼리의 결과 모두가 만족하면 true
EXISTS 서브쿼리의 결과가 존재하면(즉, 행이 1개 이상일 경우) true

 

 

IN 연산자

 IN 연산자를 서브쿼리와 함께 쓰면 메인쿼리의 데이터가 서브쿼리의 결과 중 하나라도 일치한 데이터가 있다면 실행된다. 예를들어 IN 연산자와 서브쿼리를 사용하여 각 부서별 최고 급여와 동일한 급여를 받는 사원 정보를 출력하는 쿼리문을 짜보면 아래와 같다.

 

 

SELECT *
FROM EMP
WHERE SAL IN (SELECT MAX(SAL)
		FROM EMP
              GROUP BY DEPTNO);

 

 

 

 

 

ANY, SOME 연산자

 ANY, SOME 연산자는 서브쿼리가 반환한 여러 결과 값 중 메인쿼리와 조건식을 사용한 결과가 하나라도 true라면 메인쿼리의 조건식을 true로 반화해주는 연사자다. ANY 연산자를 사용하여 30번 부서 사원들의 최대 급여(SAL = 2850)보다 적은 급여를 받는 사원의 정보를 출력해보자.

 

 

SELECT *
FROM EMP
WHERE SAL < ANY (SELECT SAL
		FROM EMP
                WHERE DEPTNO = 30)
ORDER BY SAL, DEPTNO;

 

 

 

 

 

 이번에는 반대로 30번 부서 사원들의 최소 급여(SAL=950)보다 많은 급여를 받는 사원의 정보를 출력해보자.

 

 

SELECT *
FROM EMP
WHERE SAL > ANY(SELECT SAL
		FROM EMP
                WHERE DEPTNO = 30);

 

 

 

 

ALL 연산자

 ALL 연산자는 ANY와 SOME과 달리 모든 결과가 조건식에 맞아떨어져야만 메인쿼리의 조건식이 true가 되는 연산자다. ALL 연산자를 사용하여 부서 번호가 30번인 사원들의 최소 급여(SAL=950)보다 적은 값을 가진 데이터가 출력된다.

 

 

SELECT *
FROM EMP
WHERE SAL < ALL (SELECT SAL
		 FROM EMP
                 WHERE DEPTNO = 30);

 

 

 

EXISTS 연산자

 EXISTS 연산자는 서브쿼리에 결과 값이 하나 이상 존재하면 조건식이 모두 true, 존재하지 않으면 모두 false가 되는 연산자다. 

 

 

SELECT *
FROM EMP
WHERE EXISTS (SELECT DNAME
	      FROM DEPT
              WHERE DEPTNO = 10);

 

 

 


출처:Do it! 오라클로 배우는 데이터베이스 입문(저자:이지훈 출판사:이지스퍼블리싱)