2. 다중 행 서브 쿼리
: 서브 쿼리에서 반환되는 결과가 하나 이상의 행일 때 사용하는 서브 쿼리
: 다중 행 연산자와 함께 사용
① IN 연산자
서브 쿼리의 출력 결과와 하나라도 일치하면 메인 쿼리의 WHERE 절이 참이 되도록 하는 연산자
서브 쿼리문에서 발생하는 흔한 오류
SELECT ENO, ENAME
FROM EMPLOYEE
WHERE SALARY = (SELECT MIN(SALARY)
FROM EMPLOYEE
GROUP BY DNO); -- 서브 쿼리에서 GROUP BY 절을 사용했기에 수행 결과가 여러 개 이므로 "=" 사용 불가
다중 행 연산자인 IN 사용하기 (부서별 최소 급여를 받은 사원의 사원번호와 이름 출력)
SELECT ENO, ENAME
FROM EMPLOYEE
WHERE SALARY IN (SELECT MIN(SALARY)
FROM EMPLOYEE
GROUP BY DNO);
② ANY 연산자
서브 쿼리의 결과에 존재하는 어느 하나의 값이라도 만족하는 조건
'< ANY' : 최대값보다 작음
'> ANY' : 최소값보다 큼
1000 > ANY (500, 1000, 2000) TRUE : ANY값에 1000보다 작은 500이 하나라도 있으므로
1000 = ANY (500, 1000, 2000) TRUE : ANY값에 1000과 같은 1000이 하나라도 있으므로
2000 < ANY (500, 1000, 2000) FALSE : ANY값에 2000보다 큰 값이 하나도 없으므로
ANY 연산자 사용하기 (직급이 SALESMAN이 아니면서 급여가 임의의 SALESMAN 보다 낮은 사원을 출력)
SELECT ENO, ENAME, JOB, SALARY
FROM EMPLOYEE
WHERE SALARY < ANY(SELECT SALARY
FROM EMPLOYEE
WHERE JOB = 'SALESMAN')
AND JOB <> 'SALESMAN';
/* '< ANY' : 최대값보다 작음 -> 최대 급여인 1600보다 급여가 적은 사원들만 출력됨*/
③ ALL 연산자
서브 쿼리에 결과에 존재하는 모든 값을 만족하는 조건
'> ALL' : 최대값보다 큼
'< ALL' : 최소값보다 작음
1000 > ALL (500, 1000, 2000) FALSE : 1000이 ALL의 모든 값 보다 커야하므로
1000 = ALL (500, 1000, 2000) FALSE : 1000이 ALL의 모든 값과 동일해야 하므로
3000 > ALL (500, 1000, 2000) TRUE : 3000이 ALL의 모든 값 보다 크므로
ALL 연산자 사용하기 (직급이 SALESMAN이 아니면서 직급이 SALESMAN인 사원보다 급여가 적은 사원을 모두 출력)
SELECT ENO, ENAME, JOB, SALARY
FROM EMPLOYEE
WHERE SALARY < ALL(SELECT SALARY
FROM EMPLOYEE
WHERE JOB = 'SALESMAN')
AND JOB <> 'SALESMAN';
/* '< ALL' : 최소값보다 작음 -> 최소 급여인 1250보다 급여가 적은 사원들만 출력됨*/
'SQL - Oracle > 7. 서브 쿼리 (SUBQUERY)' 카테고리의 다른 글
Day 36 : 연습 문제 - JOIN, SUBQUERY (0) | 2021.12.07 |
---|---|
Day 34 : 연습 문제 - SUBQUERY (0) | 2021.12.03 |
Day 33 : Script (0) | 2021.12.02 |
Day 33 : Exercise - 서브 쿼리 (0) | 2021.12.02 |
Day 33 : 서브 쿼리의 기본 개념 (0) | 2021.12.02 |