ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Oracle - 서브쿼리(SUBQUERY) - Part 1
    데이터베이스/Oracle 2020. 11. 16. 14:27
    728x90
    반응형

    SUBQUERY

    SUBQUERYSELECT 문장 안에 포함된 또 다른 SELECT 문장으로 메인 쿼리가 실행되기 전 한 번만 실행된다. 

    비교 연산자의 오른쪽에 기술해야 하고 반드시 괄호로 묶어야 한다.

    서브쿼리와 비교할 항목은 반드시 서브쿼리의 SELECT한 항목의 개수자료형을 일치시켜야 한다.

    즉, 메인퀘리 SELECT문을 보조하는 역할로 사용하는 SELECT문이다.

     

    [ SUBQUERY 예시 ]

    전 직원의 평균 급여보다 많은 급여를 받고 있는 직원의 사번, 이름, 직급코드 ,급여 조회

    SELECT EMP_ID, EMP_NAME, JOB_CODE, SALARY
    FROM EMPLOYEE
    WHERE SALARY >= (SELECT AVG(SALARY) FROM EMPLOYEE); -- 서브쿼리 예시

     

    서브쿼리에서는 단일행 서브쿼리, 다중행 서브쿼리, 다중열 서브쿼리, 다중행 다중열 서브쿼리, 상(호연)관 서브쿼리 ,

    스칼라 서브쿼리가 있다.

     

     

    단일 행  서브쿼리

    단일 행 서브쿼리서브쿼리의 조회 결과 값의 개수가 1개인 서브쿼리이다.

    서브쿼리의 조회 결과값의 개수가 1개일 때 단일행 서브쿼리 앞에는 일반 연산자를 사용한다.

    일반 연산자에는 ( < , >, <=, >=, =, !=/<>/^= ) 가 있다.

     

     

    [ 단일행 서브쿼리 예시 ]

    - 전 직원의 급여 평균보다 많은 급여를 받는 직원의 이름, 직급, 부서, 급여 조회

    SELECT EMP_NAME, JOB_CODE, DEPT_CODE, SALARY
    FROM EMPLOYEE E
    WHERE SALARY >= (SELECT AVG(SALARY)
    FROM EMPLOYEE)
    ORDER BY 2;

    여기서 WHERE절 안에 있는 SELECT문인 

    SELECT AVG(SALARY)
    FROM EMPLOYEE

    이 코드의 결과값은 이렇게 나타난다.

    그래서 WHERE절에 있는 서브쿼리가 AVG(SALARY)의 값으로 바뀌어져

    SELECT EMP_NAME, JOB_CODE, DEPT_CODE, SALARY
    FROM EMPLOYEE E
    WHERE SALARY >= 3047622.6086 -- .....
    ORDER BY 2;

    이러한 값으로 변환이 되어 결가값이 이렇게 나타난다.

     

     

     

     

    다중 행 서브쿼리

    다중행 서브쿼리서브쿼리의 조회 결과 값의 행이 여러 개인 서브쿼리이다.

    다중행 서브쿼리에는 일반 비교연산자를 사용할 수 없다.

    사용할 수 있는 비교연산자는 IN, NOT IN, ANY, ALL, EXISTS, NOT EXISTS 가 있다.

     

    [ 다중행 서브쿼리 예시 ]

    - 부서 별 최고 급여를 받는 직원의 이름, 직급, 부서, 급여 조회

    SELECT EMP_NAME, JOB_CODE, DEPT_CODE, SALARY
    FROM EMPLOYEE
    WHERE SALARY IN (SELECT MAX(SALARY) -- 다중행 서브쿼리
    FROM EMPLOYEE
    GROUP BY DEPT_CODE)
    ORDER BY 3;

    여기서 WHERE절에 있는 SELECT문인

    SELECT MAX(SALARY)
    FROM EMPLOYEE
    GROUP BY DEPT_CODE

    이 코드를 실행하면

    이러한 결과가 나타나는데 이 결과를 부서별로 매칭시킨다.

     

     

    다중 열 서브쿼리

    다중열 서브쿼리서브쿼리의 조회 결과 컬럼의 개수가 여러 개인 서브쿼리이다.

     

    [ 다중열 서브쿼리 예시 ]

    - 퇴사한 여직원과 같은 부서, 같은 직급에 해당하는 사원의 이름, 직급, 부서, 입사일 조회

    SELECT EMP_NAME, JOB_CODE, DEPT_CODE, HIRE_DATE
    FROM EMPLOYEE
    WHERE (DEPT_CODE, JOB_CODE) IN (SELECT DEPT_CODE, JOB_CODE
    FROM EMPLOYEE
    WHERE SUBSTR(EMP_NO, 8, 1)=2 AND ENT_YN=‘Y’);

    여기서 WHERE절에 있는 SELECT를 살펴보면

    SELECT DEPT_CODE, JOB_CODE
    FROM EMPLOYEE
    WHERE SUBSTR(EMP_NO, 8, 1)=2 AND ENT_YN=‘Y’;

    퇴사자들을 조회하는 코드이다. 이걸 실행해서 부서 코드와 직업 코드를 조회한다.

    이 결과값을 이제 메인쿼리에 매칭시켜 조회한다.

    728x90
    반응형
Designed by Tistory.