
데이터베이스에서 복잡한 조건을 처리하거나, 다른 쿼리의 결과를 이용해
조건을 구성해야 할 때 서브쿼리(Subquery) 가 자주 사용됩니다.
오라클에서는 서브쿼리를 통해 유연한 데이터 조회와 비교 연산을 수행할 수 있습니다.
이번 글에서는 오라클 서브쿼리의 개념부터 실무 활용 예제까지 정리해보겠습니다.
1. 서브쿼리(Subquery)란 무엇인가
서브쿼리(Subquery) 는 하나의 SQL문 안에 포함된 또 다른 SQL문을 말합니다.
즉, 다른 쿼리의 결과를 이용해 메인 쿼리의 조건을 만들거나 값을 비교할 수 있습니다.
📘 기본 구조
SELECT 컬럼명
FROM 테이블명
WHERE 컬럼 = (SELECT 컬럼 FROM 다른테이블 WHERE 조건);
💡 서브쿼리는 괄호 ( ) 안에 작성하며, 메인 쿼리보다 먼저 실행됩니다.
2. 오라클 서브쿼리 기본 문법
서브쿼리는 사용 위치에 따라 여러 형태로 나뉩니다.
- SELECT 절 서브쿼리 : 출력 컬럼 계산용
- FROM 절 서브쿼리 : 임시 테이블처럼 사용
- WHERE 절 서브쿼리 : 조건 비교용 (가장 일반적)
예를 들어, 특정 부서의 평균 급여보다 높은 급여를 가진 사원을 조회하려면 다음과 같이 작성합니다.
SELECT ename, sal
FROM emp
WHERE sal > (SELECT AVG(sal) FROM emp WHERE deptno = 10);
이때 (SELECT AVG(sal) …) 부분이 바로 서브쿼리입니다.
3. 단일 행 서브쿼리 예제
단일 행 서브쿼리는 결과가 한 행(1건) 만 반환됩니다.
=, <, >, <=, >= 등의 단일 비교 연산자와 함께 사용됩니다.
SELECT ename, sal
FROM emp
WHERE sal > (SELECT sal FROM emp WHERE ename = 'KING');
→ KING의 급여보다 높은 급여를 가진 사원을 조회합니다.
⚠️ 만약 서브쿼리가 여러 행을 반환하면 오류(ORA-01427)가 발생하므로 주의해야 합니다.
4. 다중 행 서브쿼리 예제
다중 행 서브쿼리는 결과가 여러 건 반환될 때 사용합니다.
이 경우에는 IN, ANY, ALL, EXISTS 등의 연산자와 함께 활용됩니다.
📘 IN 연산자 예시
SELECT ename, deptno
FROM emp
WHERE deptno IN (SELECT deptno FROM dept WHERE loc = 'DALLAS');
→ 위치가 DALLAS인 부서의 사원을 조회합니다.
📘 EXISTS 연산자 예시
SELECT dname
FROM dept d
WHERE EXISTS (SELECT 1 FROM emp e WHERE e.deptno = d.deptno);
→ 사원이 존재하는 부서만 출력합니다.
💡 EXISTS는 조건 존재 여부만 판단하기 때문에 속도가 빠른 편입니다.
5. 실무에서 자주 쓰이는 서브쿼리 활용 패턴
서브쿼리는 단순 비교 외에도 실무에서 매우 다양하게 활용됩니다.
📌 (1) TOP-N 분석
SELECT *
FROM (
SELECT ename, sal, RANK() OVER (ORDER BY sal DESC) AS rnk
FROM emp
)
WHERE rnk <= 3;
→ 급여 상위 3명을 조회할 때, FROM 절 서브쿼리를 활용합니다.
📌 (2) 최신 데이터 조회
SELECT *
FROM orders o
WHERE order_date = (SELECT MAX(order_date) FROM orders WHERE customer_id = o.customer_id);
→ 고객별 최신 주문 내역을 추출합니다.
📌 (3) 서브쿼리로 조인 대체
SELECT ename,
(SELECT dname FROM dept WHERE dept.deptno = emp.deptno) AS dept_name
FROM emp;
→ 조인 대신 SELECT 절에 서브쿼리를 사용하는 방식입니다.
✅ 마무리
오라클 서브쿼리는 SQL의 유연성을 높여주는 강력한 도구입니다.
- 단일 행 서브쿼리 : 하나의 값 비교
- 다중 행 서브쿼리 : 여러 값과의 조건 비교
- EXISTS 서브쿼리 : 존재 여부 판단
복잡한 비즈니스 로직도 서브쿼리를 적절히 활용하면 훨씬 간결하게 표현할 수 있습니다.