본문 바로가기
국비과정/Oracle

국비 32일차 - [SUBQUERY] 서브 쿼리(단일행, 다중행, 다중열, 다중행 및 다중열), 인라인 뷰, WITH, RANK 함수

by Jeong.dev 2022. 5. 12.

SUBQUERY

- SQL 문 안에 SQL 문 또 있는 것

- () 안에 넣어 표현해야 함

- 메인 쿼리 실행 전 한 번만 실행됨

 

1. 단일행 서브쿼리

- 서브 쿼리 결과 한 개의 행, 한 개의 열

 

2. 다중행 서브쿼리

- 서브 쿼리 결과 여러 개의 행, 한 개의 열

- IN, NOT IN, ANY, ALL 사용 가능

 

3. 다중열 서브쿼리

- 서브 쿼리 결과 한 개의 행, 여러 개의 열

 

4. 다중행 다중열 서브쿼리

- 서브 쿼리 결과 여러 개의 행, 여러 개의 열

-- 다중행 서브쿼리
SELECT EMP_ID, EMP_NAME, DEPT_CODE, '사수' AS "구분"
FROM EMPLOYEE
WHERE EMP_ID IN (
    SELECT DISTINCT MANAGER_ID
    FROM EMPLOYEE
    WHERE MANAGER_ID IS NOT NULL
);

 

 

인라인 뷰

- 메인 쿼리 FROM 절에 서브쿼리 사용하는 것

- 서브 쿼리 결과를 테이블 대신 사용함

SELECT ROWNUM, A.EMP_NAME, A.SALARY
FROM (
    SELECT EMP_NAME, SALARY
    FROM EMPLOYEE
    ORDER BY SALARY DESC
) A
WHERE ROWNUM <= 5;

 

 

WITH

- 서브 쿼리에 이름 붙여주고 인라인 뷰 대신 사용하는 것

- 동일 서브쿼리의 중복 작성 피할 수 있음

WITH TOPN_SAL AS (
    SELECT NVL(DEPT_CODE, '부서 없음') AS "부서코드",
           AVG(NVL(SALARY, 0)) AS "평균급여"
    FROM EMPLOYEE
    GROUP BY DEPT_CODE
    ORDER BY "평균급여" DESC
)

SELECT 부서코드, ROUND(평균급여)
FROM TOPN_SAL
WHERE ROWNUM <= 3;

 

 

RANK 함수

- 데이터 순위 함수

1. RANK() OVER(정렬 기준) : 동일 순위 있을 경우 다음 등수 건너뜀 (순위 1224557)

2. DENSE_RANK() OVER(정렬 기준) : 동일 순위 있어도 다음 등수 건너뛰지 않음(순위 1223445)

댓글