서브쿼리를 사용해야 하는 경우 정리 (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 |