<상관 서브쿼리>

일반적인 서브쿼리 방식은 서브쿼리가 만들어낸 고정된 결과값을 메인쿼리가 가져다가 사용하는 구조이나
상관서브쿼리는 반대로 메인 쿼리의 테이블값을 가져다가 서브쿼리에서 이용해서 결과를 만듦

예시1) 본인의 직급별 평균 급여보다 더 많이 받는 직원의 이름, 직급코드, 급여 조회 

SELECT E.EMP_NAME,E.JOB_CODE,E.SALARY
FROM EMPLOYEE E
WHERE SALARY > (SELECT AVG(SALARY)
                  FROM EMPLOYEE
                 WHERE JOB_CODE =E.JOB_CODE);

 

예시2) 보너스가 본인 부서의 평균 보너스보다 많은 사람들의 이름, 부서코드,급여, 보너스 조회

SELECT EMP_NAME,E.DEPT_CODE,BONUS
FROM EMPLOYEE E
WHERE BONUS > (SELECT AVG(BONUS)
                 FROM EMPLOYEE
                WHERE DEPT_CODE = E.DEPT_CODE);

 

>>상관 서브쿼리이면서 서브쿼리의 결과값이 매번 1개일 경우 "스칼라" 라고도 함

스칼라 서브쿼리의 특징 - 서브쿼리의 수행횟수를 최소화 하기위해 입력값과 출력값을 내부 캐시라는 공간에 저장해둠 
                                             입력값을 캐시에서 찾아보고 거기에 있으면 출력값을 리턴하고, 없으면 서브쿼리가 수행되도록 

 

예시3) 전체사원의 사번,이름,직급코드, 직급명 조회 

SELECT EMP_ID, EMP_NAME,E.JOB_CODE, --JOB테이블로 부터 직급코드가 E.JOB_CODE와 일치하는 직급명
       (
         SELECT JOB_NAME
         FROM JOB
         WHERE JOB_CODE = E.JOB_CODE
       )  
FROM EMPLOYEE E;

 

예시4) 전사원의 사번, 이름, 사수사번, 사수명조회

SELECT EMP_ID, EMP_NAME,--E.MANAGER_ID, 
      NVL((
       SELECT EMP_NAME
       FROM EMPLOYEE
       WHERE EMP_ID = E.MANAGER_ID
       ),'없음') "사수명"
FROM EMPLOYEE E;

 

복사했습니다!