대덕인재/Oracle

[Oracle D-14] 서브쿼리(Subquery)

꼬마버거 2025. 4. 18. 14:18

✅ 서브쿼리 기본 개념

  • 정의: 서브쿼리는 괄호 ( ) 안에 들어가는 하위 SELECT 문입니다.
  • 역할: 메인 쿼리(바깥 쿼리)에 필요한 값을 제공하거나 조건을 만들어줍니다.
  • 종류:
    1. 단일 행 서브쿼리 (Single-row subquery)
    2. 다중 행 서브쿼리 (Multi-row subquery)
    3. 다중 열 서브쿼리 (Multi-column subquery)
    4. 인라인 뷰 (Inline View)
    5. 스칼라 서브쿼리 (Scalar subquery)

📘 예제와 함께 보기

1. 단일 행 서브쿼리 

-- 급여가 전체 평균보다 높은 사원 조회
SELECT EMP_NAME, SALARY
FROM EMP
WHERE SALARY > (SELECT AVG(SALARY) FROM EMP);

🔹 서브쿼리가 평균 급여 하나만 반환 → 단일 행

 

2. 다중 행 서브쿼리 

-- SALES 부서와 같은 부서의 사원들 조회
SELECT EMP_NAME, DEPT_ID
FROM EMP
WHERE DEPT_ID IN (SELECT DEPT_ID FROM DEPT WHERE DEPT_NAME = 'SALES');

🔹 서브쿼리가 여러 개의 부서 ID를 반환할 수 있음 → 다중 행

 

3. 다중 열 서브쿼리

-- 사원 번호와 부서가 일치하는 사원 조회
SELECT *
FROM EMP
WHERE (EMP_ID, DEPT_ID) IN (SELECT EMP_ID, DEPT_ID FROM WORK_HISTORY);

 

🔹 서브쿼리가 (EMP_ID, DEPT_ID) 쌍으로 여러 행 반환

 

 4. 인라인 뷰

-- 급여 높은 순으로 상위 5명 조회
SELECT *
FROM (SELECT * FROM EMP ORDER BY SALARY DESC)
WHERE ROWNUM <= 5;

🔹 서브쿼리가 테이블처럼 사용됨 → 인라인 뷰

 

5. 스칼라 서브쿼리

-- 각 사원의 부서명을 함께 출력
SELECT EMP_NAME,
       (SELECT DEPT_NAME FROM DEPT WHERE DEPT.DEPT_ID = EMP.DEPT_ID) AS 부서명
FROM EMP;

🔹 한 행당 하나의 값만 반환됨 → 스칼라 서브쿼리

 

 

 

⚠️ 주의사항

구분 주의점
단일 행 =, >, < 등 단일 비교 연산자 사용
다중 행 IN, ANY, ALL, EXISTS 등의 연산자 필요
서브쿼리 결과가 NULL일 수 있음 결과가 없으면 조건 자체가 False 처리될 수 있음