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을 어느 때에 해야 할지에 대해 작성해볼까 한다. 감사합니다.(_ _)
'오라클' 카테고리의 다른 글
| [오라클] ROW_NUMBER() 완벽 정리(ROWNUM과 차이) (0) | 2026.01.12 |
|---|---|
| [오라클] WITH절(Subquery Factoring) 완벽 정리 (1) | 2026.01.10 |
| [오라클] EXISTS와 IN 함수 차이 비교 완벽 정리 (0) | 2026.01.08 |
| [오라클] WHERE 절과 HAVING 절의 차이 (0) | 2026.01.07 |
| [오라클] 인덱스(Index) 완벽 정리 (0) | 2026.01.06 |