- 단일행 서브쿼리
서브쿼리의 조회 결과 값의 개수가 1개인 서브쿼리- 다중행 서브쿼리
서브쿼리의 조회 결과 값의 행이 여러 개인 서브쿼리- 다중열 서브쿼리
서브쿼리의 조회 결과 컬럼의 개수가 여러 개인 서브쿼리- 다중행 다중열 서브쿼리
서브쿼리의 조회 결과 컬럼의 개수와 행의 개수가 여러 개인 서브쿼리- 상(호연)관 서브쿼리
서브쿼리가 만든 결과 값을 메인 쿼리가 비교 연산할 때
메인 쿼리 테이블의 값이 변경되면 서브쿼리의 결과 값도 바뀌는 서브쿼리- 스칼라 서브쿼리
상관쿼리이면서 결과 값이 한 개인 서브쿼리
EX) 전 직원의 급여 평균보다 많은(초과) 급여를 받는 직원의
이름, 직급, 부서명, 급여를 직급 순으로 정렬하여 조회
SELECT EMP_NAME, JOB_NAME, DEPT_TITLE, SALARY FROM EMPLOYEE
JOIN JOB USING (JOB_CODE)
LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
WHERE SALARY > (SELECT AVG(SALARY) FROM EMPLOYEE)
ORDER BY JOB_CODE;
다중행 서브쿼리 앞에는 일반 비교연산자 사용 X
IN/NOT IN: 여러 개의 결과값 중에서 한 개라도 일치하는 값이 있다면
혹은 없다면 이라는 의미 ( 가장 많이 사용! )> ANY,< ANY: 여러 개의 결과 값 중에서 한 개라도 큰 / 작은 경우
가장 작은 값 보다 큰가 ? / 가장 큰 값 보다 작은가?> ALL,< ALL: 여러 개의 결과 값의 모든 값 보다 큰/ 작은 경우
가장 큰 값 보다 큰가? / 가장 작은 값 보다 작은가?EXISTS/NOT EXISTS: 값이 존재하는가? / 존재하지 않는가?
EX) 부서별 최고 급여를 받는 직원의 이름, 직급, 부서, 급여를 부서 순으로 정렬하여 조회
SELECT EMP_NAME, JOB_CODE, DEPT_CODE, SALARY FROM EMPLOYEE
WHERE SALARY IN (SELECT MAX(SALARY) FROM EMPLOYEE GROUP BY DEPT_CODE)
ORDER BY DEPT_CODE ;
EX) 퇴사한 여직원과 같은 부서, 같은 직급에 해당하는
사원의 이름, 직급, 부서, 입사일을 조회
SELECT EMP_NAME, JOB_CODE, DEPT_CODE, HIRE_DATE FROM EMPLOYEE
WHERE (DEPT_CODE, JOB_CODE) = (SELECT DEPT_CODE, JOB_CODE FROM EMPLOYEE
WHERE ENT_YN = 'Y'
AND SUBSTR(EMP_NO, 8,1) ='2');
EX) 본인 직급의 평균 급여를 받고 있는 직원의 사번, 이름, 직급, 급여를 조회
단, 급여와 급여 평균은 만원단위로 계산 TRUNC (컬럼명, -4)
SELECT EMP_ID, EMP_NAME, JOB_CODE, SALARY FROM EMPLOYEE
WHERE (JOB_CODE , SALARY) IN (SELECT JOB_CODE, TRUNC(AVG(SALARY), -4) FROM EMPLOYEE
GROUP BY JOB_CODE);
SELECT EMP_ID, EMP_NAME, DEPT_CODE, MANAGER_ID
FROM EMPLOYEE E
WHERE EXISTS (SELECT EMP_ID
FROM EMPLOYEE M
WHERE E.MANAGER_ID = M.EMP_ID);
SELECT E.EMP_ID, E.EMP_NAME, E.MANAGER_ID,
NVL((SELECT M.EMP_NAME
FROM EMPLOYEE M
WHERE E.MANAGER_ID = M.EMP_ID), ‘없음’) AS 관리자명
FROM EMPLOYEE E
ORDER BY 1;