Skip to content

서브쿼리

서브쿼리란 하나의 SQL문 안에 포함되어 있는 또 다른 SQL문을 말한다.

조인은 조인에 참여하는 모든 테이블이 대등한 관계에 있기 때문에, 조인에 참여하는 모든 테이블의 컬럼을 어디에서든 자유롭게 사용(참조)할 수 있지만, 서브퀴리는 메인쿼리에서 따로 파생되어 생긴 쿼리이기 떄문에 자유로운 참조가 불가능하다.

서브쿼리는 메인쿼리의 컬럼을 모두 사용할 수 있지만, 메인 쿼리는 서브쿼리의 컬럼을 사용할 수 없다. 메인쿼리는 서브쿼리에게 자신의 컬럼을 줄 수 있지만, 서브쿼리의 컬럼을 사용할 순 없다. 반대로 서브쿼리는 메인쿼리가 가지고 있는 컬럼을 사용할 수 있지만, 컬럼을 줄 순 없다.

서브쿼리 사용 위치

서브쿼리 사용이 가능한 위치는 다음과 같다. 똑같은 서브쿼리라도 위치에 따라 다른 명칭으로 불리기도 한다.

위치명칭
SELECT절스칼라 서브쿼리
FROM절인라인뷰 서브쿼리 (한 라인으로 일회용 뷰를 생성하는 것과 비슷한 느낌이다.)
WHERE절서브쿼리
HAVING절서브쿼리
INSERT문의 VALUES절서브쿼리
UPDATE문의 SET절서브쿼리

동작 방식에 따른 서브쿼리 분류

서브쿼리는 동작 방식에 따라 아래 두가지로 분류할 수 있다.

동작방식설명
비연관 서브쿼리- 서브쿼리가 메인쿼리의 컬럼을 가지고 있지 않은 형태의 서브쿼리이다.
- 메인쿼리에 값을 제공하기 위한 목적으로 주로 사용한다.
(ex. SELECT절, FROM절, VALUES절 등)
연관 서브쿼리- 서브쿼리가 메인쿼리의 컬럼을 가지고 있는 형태의 서브쿼리다.
- 일반적으로 메인쿼리를 수행하여 읽은 데이터의 조건을 확인하기 위해 사용된다.
(ex. WHERE절, HAVING절 등… 단, 절대적인 것은 아니다!)

동작 방식에 따른 서브쿼리 분류

서브쿼리는 반환 형태에 따라 아래 세가지로 분류할 수 있다.

반환 형태설명
단일행 서브쿼리- 서브쿼리의 실행 결과가 항상 1건 이하인 서브쿼리를 의미한다.
- 항상 비교 연산자과 함께 사용된다(=, <, <+, >, >=, <>)
다중행 서브쿼리- 서브쿼리의 실행 결과가 여러 건인 서브쿼리를 의미한다.
- 다중행 비교 연산자와 함께 사용된다.(IN, ALL, ANY, SOME, EXISTS)
다중컬럼 서브쿼리- 서브쿼리의 실행 결과로 여러(다중) 컬럼을 반환한다.
- 메인쿼리의 조건 절에 여러 컬럼을 동시에 비교할 수 있다.
- 서브쿼리와 메인쿼리의 컬럼 수와 컬럼 순서가 동일해야한다.

서브쿼리는 특정 값을 메인쿼리에 반환하게 된다. 이때 1건 혹은 0건을 반환하는 서브쿼리를 단일행 서브쿼리라고 부르고, 여러거느이 행을 반환하는 서브쿼리를 다중행 서브쿼리라고 한다. 또한 단일행이든 다중행이든 반환하는 컬럼의 개수가 2개 이상인 경우 다중컬럼 서브쿼리라고 한다.

서브쿼리 사용시 주의점

서브쿼리를 사용할 때는 다음과 같은 사항을 유의해야한다.

  • 서브쿼리는 꼭 소괄호()로 감싸서 사용해야한다.
  • 서브쿼리 내에서는 ORDER BY 절을 사용하지 못한다. ORDER BY절은 전체 SQL문 내에서 오직 1개, 맨 마지막 SQL문 아래에만 올 수 있다.