본문 바로가기
오라클

[오라클] SELECT 서브쿼리 SELECT, FROM, WHERE 완벽 정리(서브쿼리, 스칼라 서브쿼리, 인라인 뷰)

by devlog93 2026. 1. 9.

SQL을 사용하다 보면 한 번의 SELECT문만으로 원하는 결과를 얻기 어려운 경우가 많다. 이럴 때 사용하는 것이 서브쿼리이다. 서브쿼리는 말 그래도 쿼리 안에 또 쿼리가 있는 형태를 의미하고 복잡한 조건이나 계산 결과를 기준으로 데이터를 조회할 때 매우 유용한 것 같다. 

 

기본적인 SELECT문은 ↓ 참고하자.

 

 

[오라클] SELECT 문법 완벽 정리 ( 기본부터 실무까지 )

SELECT란?SELECT는 데이터베이스에 저장된 데이터를 조회하는 SQL 문법이다. 오라클 SQL에서 많이 사용되며 모든 조회 쿼리는 SELECT에서 시작한다. 제 경험이 그렇게 많지는 않지만.. SELECT 쿼리가 알면

devlog93.tistory.com

 


1. 서브쿼리란?

서브쿼리는 메인 쿼리가 실행되기 전에 먼저 실행되는 SELECT문이다. 서브쿼리의 실행 결과를 바탕으로 메인 쿼리가 동작하게 된다. 예시를 보자.

  • 서브쿼리에서 전체 사원의 평균 급여를 구한다.
  • 그 결과보다 급여(SAL)가 높은 사원만 조회한다.
SELECT *        -- 예시 *사용
  FROM EMP
 WHERE SAL > (
              SELECT AVG(SAL)
                FROM EMP
              );

2. 서브쿼리가 사용되는 위치

서브쿼리는 SQL문에서 여러 위치에 사용이 될 수 있는데 한번 알아보자...!

✅ WHERE 절 서브쿼리

많이 사용되는 형태로 조건 비교에서 사용한다. 

  • 최고 급여를 받는 사원을 조회 하는 쿼리.
SELECT ENAME
     , SAL
  FROM EMP
 WHERE SAL = (
              SELECT MAX(SAL)
                FROM EMP
             );

✅ SELECT 절 서브쿼리 (스칼라 서브쿼리)

SELECT 절에서도 서브쿼리를 사용할 수 있다. 이 경우는 반드시 하나의 값만 반환해야 함...! 주의하자

  • 각 사원 정보와 함께 전체 평균 급여를 AVG_SAL로 표시한다. 이런 형태를 스칼라 서브쿼리라고 한다.
SELECT ENAME
     , SAL
     , (SELECT AVG(SAL) FROM EMP) AS AVG_SAL
  FROM EMP;

✅ FROM절 서브쿼리 (인라인 뷰)

FROM 절에 서브쿼리를 사용하면 임시 테이블 처럼 활용이 가능하다...!

  • 급여가 3000이상인 사원 목록을 하나의 테이블처럼 조회
SELECT *
  FROM (
        SELECT ENAME
             , SAL
          FROM EMP
         WHERE SAL >= 3000
        );

3. 단일 행 서브쿼리 vs 다중 행 서브쿼리

◆ 단일 행 서브쿼리

서브쿼리가 하나의 값만 반환 하는경우

  • =, >, < 같은 일반 비교 연산자 사용 가능하다.
WHERE SAL > (SELECT AVG(SAL) FROM EMP);

◆ 다중 행 서브쿼리

서브쿼리가 여러 행을 반환하는 경우

  • IN, ANY, ALL, EXISTS 같은 연산자 사용 가능하다.
WHERE DEPTNO IN (
                 SELECT DEPTNO
                   FROM DEPT
                  WHERE LOC = 'SEOUL'
                 );

4.  서브쿼리 사용 시 주의할 점

  • SELECT 절 서브쿼리는 반드시 단일 값 반환(스칼라 서브쿼리)
  • 다중 행 서브쿼리에 = 사용 시 오류 발생
  • 불필요하게 복잡한 서브쿼리는 JOIN으로 대체가 되는지 고민하자.

마무리

SELECT 서브쿼리는 단순히 쿼리 안에 사용하는 것도 있지만 데이터를 단계적으로 조건을 유연하게 구성할 수 있는 문법이다. 처음 접하게 되면 서브쿼리가 뭐지? 스칼라가 뭐지? 인라인 뷰가 뭐지? 하지만 쿼리를 작성하다 보면 알게 될 것이다. 물론 SELECT쿼리가 길어지면 길어질수록 어려운 건 맞다...ㅠㅠ 사용위치에 따라 다르다는 것만 기억하면 될 것 같다. WHERE절, SELECT절, FROM절 이렇게 말이다. 긴 쿼리여도 이렇게 이해하면 조금이나마 이해하기 쉬울 것이다. 다음 글로는 서브쿼리나 JOIN을 어느 때에 해야 할지에 대해 작성해볼까 한다. 감사합니다.(_ _)