SUBQUERY : INLINE VIEW 인라인 뷰

2024. 3. 3. 15:37DBMS/SQLQuery

반응형

FROM 절에 오는 서브쿼리는 다른 테이블이나 뷰로부터 데이터를 가져올 수 있고 서브쿼리를 사용하여 데이터를 동적으로 처리할 수 있다.

서브쿼리를 사용하면 쿼리의 논리를 더 작은 논리 블록으로 분할하여 이해하기 쉽게 만들 수 있다.

EX

SELECT 
    D.DEPARTMENT_ID,
    D.DEPARTMENT_NAME,
    AVG_SALARY

FROM 

    (
        SELECT
                DEPARTMENT_ID,
                ROUND(AVG(SALARY),2) AS AVG_SALARY
                
                FROM
                    EMPLOYEES
                    
                GROUP BY
                    DEPARTMENT_ID
                    
    )    SUB
    
JOIN DEPARTMENTS D ON SUB.DEPARTMENT_ID = D.DEPARTMENT_ID;

 

부서별 평균 급여를 계산하는 서브쿼리이다.

먼저 부서별 직원들의 평균을 낸 다음 각 부서의 평균 급여를 계산한다. 

쿼리의 논리가 서브와 외부로 분할되어 가독성이 향상된다. 

외부 쿼리는 속성의 역할을 명확하게 보여주며, 서브쿼리는 부서별 평균 급여를 계산하는 역할을 수행한다.

 

SELECT 
    DEPARTMENTS.DEPARTMENT_ID,
    DEPARTMENTS.DEPARTMENT_NAME,
    ROUND(AVG(EMPLOYEES.SALARY), 2) AS AVG_SALARY
FROM 
    EMPLOYEES
JOIN 
    DEPARTMENTS ON EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID
GROUP BY 
    DEPARTMENTS.DEPARTMENT_ID,
    DEPARTMENTS.DEPARTMENT_NAME;

 

 

인라인 뷰 대신 DEPTID와 DEPTNAME 을 그룹화 하여 사용함

 

 



코드의 중복을 줄이고 유지 보수를 단순화하기 위해 동일한 서브쿼리를 재사용 할 수 있다.
EX

WITH AVSAL AS (
    SELECT 
            DEPARTMENT_ID,
            ROUND(AVG(SALARY),2) AS AVG_SALARY
            
    FROM
            EMPLOYEES
    GROUP BY 
            DEPARTMENT_ID
            )
            --서브쿼리로 부터 부서별 평균 급여를 가지고 옴
            


    SELECT
            D.DEPARTMENT_ID,
            D.DEPARTMENT_NAME,
            AVSAL.AVG_SALARY
            
    FROM 
            DEPARTMENTS D
            
    JOIN AVSAL ON D.DEPARTMENT_ID = AVSAL.DEPARTMENT_ID;

 

 

 

 

부서별 평균급여 이상을 받는 직원 추출

 

WITH AVSAL AS (
    SELECT 
            DEPARTMENT_ID,
            ROUND(AVG(SALARY),2) AS AVG_SALARY
            
    FROM
            EMPLOYEES
    GROUP BY 
            DEPARTMENT_ID
            )
            --서브쿼리로 부터 부서별 평균 급여를 가지고 옴
            


    SELECT
    
    E.EMPLOYEE_ID,
    E.FIRST_NAME,
    E.LAST_NAME,
    E.SALARY,
    AVG_SALARY
    
    FROM 
    EMPLOYEES E
    JOIN AVSAL ON  E.DEPARTMENT_ID = AVSAL.DEPARTMENT_ID
    
    WHERE 
    E.SALARY>AVSAL.AVG_SALARY;

 

 

 

 

 

 

 


FROM 절의 서브쿼리를 사용하면 실행 시점에 동적으로 데이터를 생성할 수 있다. 이는 특정 필터링 조건이나 계산된 열을 사용하여 데이터를 생성하는 데 유용하다.

EX

 SELECT
            DEPARTMENT_ID,
            AVG(SALARY) AS AVG_DEPT_SALARY
        FROM 
            EMPLOYEES
        GROUP BY
            DEPARTMENT_ID

 

 

 

SELECT 
    e.EMPLOYEE_ID,
    e.FIRST_NAME,
    e.LAST_NAME,
    e.SALARY
FROM 
    EMPLOYEES e
JOIN 
    (
        SELECT 
            DEPARTMENT_ID,
            AVG(SALARY) AS AVG_DEPT_SALARY
        FROM 
            EMPLOYEES
        GROUP BY 
            DEPARTMENT_ID
    ) sub ON e.DEPARTMENT_ID = sub.DEPARTMENT_ID
WHERE 
    e.SALARY > sub.AVG_DEPT_SALARY;

 

FROM 절 평균 급여 계산 쿼리를 사용하여 이 평균 급여보다 높은 급여를 받는 직원들을 선택하여 출력함

실행 시점에서 동적으로 데이터를 생성하여 원하는 필터링이나 계산을 적용할 수 있다.

 

 

 

반응형

'DBMS > SQLQuery' 카테고리의 다른 글

PIVOT, CASE  (0) 2024.03.03
파생 속성(Derived Attribute)  (0) 2024.03.03
IFNULL , NVL  (0) 2024.03.03
RATIO_TO_REPORT, 파티션 별 합계에서 차지하는 비율  (0) 2024.03.03
집계 함수와 윈도우 함수  (0) 2024.03.03