서브쿼리는 쿼리 내의 다른 쿼리로 메인쿼리에 필요한 데이터를 필터링, 변환 또는 집계하는 데 사용됩니다.
1개의 SQL문 내에 포함된 **SELECT
**문을 의미하며, 서브쿼리 밖에 있는 SQL문을 메인쿼리라고 합니다.
서브쿼리는 소괄호 안에 작성되며, 메인쿼리에서 필요한 데이터를 제공하는 데 사용됩니다. 서브쿼리는 단독으로 실행될 수 없으며, 항상 메인쿼리와 연계되어 실행됩니다.
복잡한 데이터 요구사항을 처리하기 위한 효과적인 도구로서, 두 개 이상의 테이블에서 데이터를 참조할 때나 복잡한 SQL 문을 작성할 필요가 있을 때 주로 사용됩니다.
<aside>
💡 **JOIN
**으로 작성된 SQL 문은 서브쿼리가 포함된 SQL 문으로 변경할 수 있습니다.
**JOIN
**도 서브쿼리와 마찬가지로 두 개 이상의 테이블에서 데이터를 가져오는 데 사용하지만, 2개의 테이블에서 1개의 결과를 얻고자 할 때는 서브쿼리문을 사용하고 3개 이상의 테이블에서 데이터를 얻고자 하는 경우는 **JOIN
**을 사용하는 것을 권장합니다.
3개 이상의 테이블에서는 서브쿼리 대신 **JOIN
**을 사용할 시 쿼리가 더 간결해지고 가독성이 높아질 수 있기 때문입니다.
</aside>
서브쿼리는 SELECT
, FROM
, WHERE
, HAVING
및 JOIN
절 등 다양한 SQL 절에서 활용될 수 있으며, 메인쿼리보다 먼저 실행되는 종속적인 구조를 가지고 있습니다.
서브쿼리는 소괄호 내에 정의되며, 단일 값 또는 집합 값을 반환할 수 있습니다.
또한, 다양한 비교 연산자(=
, <
, >
, IN
, NOT IN
, EXIST
, NOT EXIST
등)와 결합하여 복잡한 조건을 표현하는 데 활용할 수 있습니다.
<aside>
💡 서브쿼리의 종류나 목적에 따라서 **ORDER BY
**절은 사용할 수 없습니다.
조건절 서브쿼리(IN
, EXISTS
등)는 결과 집합의 존재를 확인하는 것이기 때문에 해당 구문 안에서는 **ORDER BY
**절을 사용할 수 없습니다.
</aside>
서브쿼리는 알려지지 않은 기준으로 검색할 때 용이합니다. 테이블 내에서 조건을 설정하기 어려워 다른 테이블에서 조건을 가져와야 할 경우 서브쿼리를 사용합니다. 서브쿼리는 특정 기준값을 미리 계산하고, 그 값을 바탕으로 다른 쿼리에서 활용하는 상황에서 큰 장점을 발휘합니다. 또한 아래와 같이 열 데이터 생성, 임시 테이블 생성, 집합 연산 수행, 데이터 검증, 복잡한 질의처리 시 서브쿼리를 활용할 수 있습니다.