서브쿼리 (SUBQUERY)

DONI·2021년 9월 29일
0

Oracle

목록 보기
4/22
post-thumbnail

🏹 다중 행 서브쿼리 (MULTI ROW SUBQUERY)

서브쿼리의 조회 결과 값의 행이 여러 개인 서브쿼리
  ⭐ 사용 가능 연산자 : IN, ANY, ALL, EXISTS

  • IN : 여러 개의 결과값 중에서 한 개라도 일치하는 값이 있다면

  • ANY : 여러 개의 결과값 중에서 한 개라도 크거나 작을 경우
             가장 작은 값보다 큰가? / 가장 큰 값 보다 작은가?

  • ALL : 여러 개의 결과값이 모든 값보다 크거나 작을 경우
            가장 큰 값보다 큰가? / 가장 작은 값 보다 작은가?

  • EXISTS : 값이 존재하는가?


🏹 상[호연]관 서브쿼리

메인쿼리가 사용하는 테이블 값을 서브쿼리가 이용해서 결과를 만드는 서브쿼리
메인쿼리의 테이블 값이 변경되면 서브쿼리의 결과 값도 변경되는 구조

  • 기존 서브쿼리 SQL 해석 순서 : 서브쿼리 → 메인쿼리
  • 상관 서브쿼리 SQL 해석 순서 : 메인쿼리 → 서브쿼리

🏹 스칼라 서브쿼리

SELECT절에 사용되는 단일 행 서브쿼리
보통 상관 서브쿼리와 함께 사용됨
SELECT EMP_NAME, DEPT_CODE,
(SELECT EMP_NAME FROM EMPLOYEE WHERE JOB_CODE = 'J1') 대표
FROM EMPLOYEE;


🏹 인라인 뷰 (INLINE-VIEW)

FROM 절에서 서브쿼리를 사용하는 경우로,
서브쿼리가 만든 결과의 집합(RESULT SET)을 테이블 대신 사용
SELECT EMP_NAME, SALARY FROM
(SELECT * FROM EMPLOYEE ORDER BY SALARY DESC)
WHERE ROWNUM <= 5;


🏹 WITH

서브쿼리에 이름을 붙여주고 인라인 뷰로 사용 시 서브쿼리의 이름으로 FROM절에 기술
실행 속도가 빨라진다는 장점이 있음

SELECT ROWNUM 순위, EMP_NAME 이름, SALARY 급여 FROM
(SELECT EMP_NAME, SALARY FROM EMPLOYEE ORDER BY SALARY DESC);

   🔻 WITH 사용

WITH SALARY_RANK AS (SELECT EMP_NAME, SALARY FROM EMPLOYEE ORDER BY SALARY DESC)
SELECT ROWNUM 순위, EMP_NAME 이름, SALARY 급여 FROM SALARY_RANK;


🏹 RANK( ) OVER / DENSE_RANK( ) OVER

  • RANK( ) OVER
    : 공동 1위가 2명이면 다음 순위는 2위가 아니라 3위
    SELECT RANK() OVER (ORDER BY SALARY DESC) 순위,
    EMP_NAME, SALARY FROM EMPLOYEE;

  • DENSE_RANK( ) OVER
    : 공동 1위가 2명이어도 다음 순위는 2위
    SELECT DENSE_RANK() OVER (ORDER BY SALARY DESC) 순위,
    EMP_NAME, SALARY FROM EMPLOYEE;


🚩 소스코드

  • CASE 선택 함수를 이용한 다중 행 서브쿼리
SELECT EMP_ID, EMP_NAME, DEPT_TITLE, JOB_NAME, 
    CASE
        WHEN EMP_ID IN (SELECT DISTINCT MANAGER_ID FROM EMPLOYEE
                        WHERE MANAGER_ID IS NOT NULL)
        THEN '사수'
        ELSE '사원'
    END 구분
FROM EMPLOYEE
LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
JOIN JOB USING (JOB_CODE);
profile
틀린 내용이 있다면 댓글 또는 이메일로 알려주세요 ❤ꔛ❜

0개의 댓글