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보다 급여가 적은 사원들만 출력됨*/

+ Recent posts