[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);
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)