alt

[SQLD 특강] 서브쿼리편

2026년 11월 9일 공유

SQL 서브쿼리 핵심 정리

개요

서브쿼리는 쿼리 안에 포함된 쿼리이며, 바깥쪽 쿼리는 메인 쿼리라고 한다. 메인 쿼리에서 바로 알 수 없는 값을 다른 행이나 테이블에서 구해 비교하거나, 결과를 테이블처럼 활용하거나, 출력값으로 포함할 때 사용한다. SELECT뿐 아니라 INSERT, UPDATE, DELETE에서도 사용할 수 있다.

핵심 개념

  • 단일행 서브쿼리: 한 행을 반환한다. =, <>, <, > 같은 단순 비교 연산자와 함께 사용할 수 있다.
  • 다중행 서브쿼리: 여러 행을 반환한다. IN, ANY, ALL 등 다중행 연산자를 사용한다.
  • 다중 컬럼 서브쿼리: 여러 컬럼을 반환하며, 메인 쿼리의 대응 컬럼들을 묶어 비교한다.
  • 연관 서브쿼리: 서브쿼리가 메인 쿼리의 컬럼값을 참조해 메인 쿼리의 각 행에 따라 수행된다.
  • 비연관 서브쿼리: 메인 쿼리의 값에 의존하지 않고 독립적으로 수행된다.
  • 인라인 뷰: FROM 절의 서브쿼리 결과를 임시 테이블처럼 사용한다.
  • 스칼라 서브쿼리: SELECT 절에서 단일 값처럼 사용하는 서브쿼리다.

상세 노트

서브쿼리를 사용하는 이유

한 행의 값만으로는 필요한 비교 기준을 알 수 없는 경우가 있다. 예를 들어 직원의 급여가 전체 평균보다 높은지 판단하려면 전체 평균 급여가 필요하다. 서브쿼리로 평균을 먼저 구해 메인 쿼리에 전달하면 각 행의 급여와 비교할 수 있다.
서브쿼리와 조인은 모두 추가 정보를 얻는 데 쓰인다. 어떤 방식이 더 적절한지는 상황과 성능에 따라 달라질 수 있다.

단일행 서브쿼리

서브쿼리가 하나의 행을 반환할 때 사용한다. 예를 들어 전체 평균 급여보다 높은 직원을 찾거나, 최대 급여를 받는 직원을 찾을 때 적합하다.
  • 평균 급여나 최대 급여처럼 하나의 값과 비교한다.
  • 여러 행이 반환되는데 = 같은 단순 비교 연산자를 사용하면 오류가 발생한다.

다중행 서브쿼리와 연산자

여러 행을 반환하는 결과는 단일 값처럼 직접 비교할 수 없다. 여러 값 중 하나와 일치하는지, 또는 여러 값과 대소 비교하는지에 맞는 연산자를 써야 한다.
  • IN: 반환된 값 중 하나와 일치하는지 확인한다.
  • ALL: 모든 값과 비교 조건을 만족해야 한다.
  • > ALL (...)은 결과 중 최댓값보다 큰 값을 찾는 것과 같다.
  • < ALL (...)은 결과 중 최솟값보다 작은 값을 찾는 것과 같다.
  • ANY: 반환된 값 중 하나 이상과 비교 조건을 만족하면 된다.
  • > ANY (...)는 결과 중 최솟값보다 큰 값을 찾는 것과 같다.
  • < ANY (...)는 결과 중 최댓값보다 작은 값을 찾는 것과 같다.
여러 값을 대상으로 단순 비교 연산자를 사용해야 한다면, 서브쿼리에서 MAX나 MIN 등을 사용해 결과를 단일 값으로 만들거나 ALL·ANY를 사용한다.

다중 컬럼 서브쿼리

서브쿼리 결과의 여러 컬럼을 메인 쿼리의 여러 컬럼과 함께 비교한다. 비교할 메인 쿼리 컬럼은 괄호로 묶는다.
예를 들어 차량 종류별 최저가를 구해 원본 차량 데이터와 비교할 때, 차량 종류와 요금을 함께 비교해야 한다. 요금만 비교하면 다른 종류의 차량 최저가와 잘못 매칭될 수 있다. 결과가 여러 행이면 IN을 사용할 수 있다.

연관 서브쿼리

서브쿼리에서 메인 쿼리의 컬럼을 참조한다. 메인 쿼리의 각 행에 해당하는 값을 서브쿼리에 전달해 그 행에 맞는 기준을 계산한다.
예를 들어 각 부서에서 부서 평균 급여보다 높은 직원을 찾으려면, 각 직원의 부서 번호를 서브쿼리에 전달해 해당 부서의 평균 급여를 구한다. 차량 종류별 평균 요금과 각 차량의 요금을 비교하는 경우도 같은 원리다.
테이블을 같은 쿼리에서 여러 번 사용할 때는 별칭을 붙여 각 참조를 구분한다.

인라인 뷰

FROM 절에서 서브쿼리 결과를 테이블처럼 사용한다. 그룹별 최대·평균 요금 같은 기준표를 먼저 만든 뒤 원본 테이블과 조인하면 원하는 행을 찾을 수 있다.
  • 인라인 뷰에는 테이블 별칭을 부여한다.
  • 그룹 함수 결과는 인라인 뷰에서 계산하고, 바깥 쿼리에서는 별칭으로 참조한다.
  • 결과가 테이블처럼 다뤄지므로 여러 컬럼을 각각 비교할 수 있다.

스칼라 서브쿼리

SELECT 절에서 서브쿼리 결과를 출력 컬럼처럼 사용한다. 각 행에 대응하는 값은 하나여야 한다.
  • 전체 평균 요금을 각 차량 정보와 함께 출력할 수 있다.
  • 차량 종류별 평균 요금처럼 행마다 기준이 달라지는 값은 메인 쿼리의 차량 종류를 참조하는 연관 서브쿼리로 구할 수 있다.

적용 범위와 유의점

서브쿼리는 WHERE 절의 조건뿐 아니라 FROM 절의 인라인 뷰, SELECT 절의 스칼라 서브쿼리, UPDATE 등의 문장에서도 활용할 수 있다. 다만 서브쿼리 결과의 행·컬럼 개수와 메인 쿼리의 비교 방식이 맞아야 한다. 단일 값이 필요한 곳에 여러 행이 반환되거나, 비교할 수 없는 형태를 사용하면 오류가 발생한다.
공개 노트 모두 보기