SQL

서브쿼리

1space 2025. 7. 16. 17:21

서브쿼리를 사용해야 하는 경우 정리 (Oracle SQL)

SQL에서 단순 조회는 어렵지 않지만, 특정 조건이나 정렬 기준을 우선 적용한 후 일부 행만 추출하거나 계산된 값을 조건으로 사용할 경우, 단순 쿼리로는 원하는 결과를 얻기 어렵습니다. 이럴 때는 서브쿼리(Subquery)를 적절히 사용해야 합니다.

 

정렬된 결과에서 상위 N개만 조회하고 싶을 때

예시 요구사항

"최신 등록순으로 정렬된 결과에서 상위 10명을 조회하시오."

 

❌ 잘못된 쿼리 (순서 오류 발생)

SELECT * FROM MEMBER 
WHERE ROWNUM BETWEEN 1 AND 10
ORDER BY REGDATE DESC;
  • ROWNUM은 정렬 전에 부여되기 때문에, 최신 순으로 정렬된 결과가 아님.
  • ORDER BY는 WHERE 절 이후에 실행되어 순서가 뒤바뀜 → ❌

해결 방법: 서브쿼리로 정렬 후 ROWNUM 적용

SELECT * 
FROM (
    SELECT * FROM MEMBER 
    ORDER BY REGDATE DESC
)
WHERE ROWNUM BETWEEN 1 AND 10;
  • 서브쿼리에서 먼저 정렬된 결과를 만들고,
  • 바깥 쿼리에서 ROWNUM을 적용해야 의도한 대로 작동합니다.

 

평균 이상의 회원만 조회하고 싶을 때

예시 요구사항

"평균 나이 이상인 회원 목록을 조회하시오."

❌ 잘못된 쿼리 (상수 하드코딩)

SELECT * FROM MEMBER
WHERE AGE >= 30;
  • 이 쿼리는 항상 30세 이상만 조회하며, 데이터가 바뀌어도 자동으로 반영되지 않음.
  • 우리가 원하는 것은 회원 평균 나이 이상인 사람들 → 동적으로 구해야 함.

해결 방법: 서브쿼리로 평균을 동적으로 계산

SELECT * 
FROM MEMBER 
WHERE AGE >= (
    SELECT AVG(AGE) FROM MEMBER
);
  • 서브쿼리를 통해 AVG(AGE)를 먼저 계산하고,
  • 그 결과값을 기준으로 조건을 적용합니다.
  • 즉, 동적 조건 처리를 위해 서브쿼리를 사용하는 대표적인 사례입니다.

'SQL' 카테고리의 다른 글

OUTER JOIN  (0) 2025.07.16
INNER JOIN  (0) 2025.07.16
ROW_NUMBER(), RANK()  (0) 2025.07.16
GROUPBY, HAVING  (0) 2025.07.16
SELECT구절과 ODERBY  (0) 2025.07.16