상관 쿼리는 메인쿼리가 사용하는 테이블 값을 서브쿼리가 이용해서 결과를 만든다.
메인쿼리의 테이블값이 변경되면 서브쿼리의 결과값도 바뀌게 되는 구조
상관쿼리는 먼저 메인쿼리를 한 행 조회하고,
해당 행이 서브쿼리에 조건을 충족하는지 확인하여 SELECT를 진행한다.
해석 순서가 기존 서브쿼리와는 다르게
메인쿼리 1행 -> 1행에 대한 서브쿼리
메인쿼리 2행 -> 2행에 대한 서브쿼리
.....
메인쿼리의 행의 수 만큼 서브쿼리가 생성되어 진행된다.
직급별 급여 평균보다 급여를 많이 받는 직원의
이름, 직급코드 , 급여 조회
SELECT EMP_NAME, JOB_CODE ,SALARY --메인쿼리
FROM EMPLOYEE MAIN
WHERE SALARY > (SELECT AVG(SALARY)
FROM EMPLOYEE SUB
WHERE SUB.JOB_CODE = MAIN.JOB_CODE);
부서별 입사일이 가장 빠른 사원의
사번, 이름, 부서명(NULL이면 '소속없음') , 직급명, 입사일을 조회하고
입사일이 빠른 순으로 조회하시오 (오름차순)
단, 퇴사한 직원은 제외하고 조회하기
SELECT EMP_ID ,EMP_NAME , NVL(DEPT_TITLE, '소속없음'), JOB_NAME, HIRE_DATE
FROM EMPLOYEE MAIN
JOIN JOB USING(JOB_CODE)
JOIN DEPARTMENT ON(DEPT_ID = DEPT_CODE)
WHERE ENT_YN = 'N'
AND HIRE_DATE =
(SELECT MIN(HIRE_DATE)
FROM EMPLOYEE SUB
WHERE SUB.DEPT_CODE = MAIN.DEPT_CODE)
ORDER BY HIRE_DATE;
-- 1) MAIN의 1행의 DEPT_CODE를 SUB에 대입중
-- 2) SUB를 수행
-- 3) SUB의 결과를 이용해서 MAIN의 조건절 수행