(DB실무) Part4-SQL 기본 및 활용-6.Subquery
2026년 11월 8일 공유
SQL 서브쿼리와 뷰
개요
- 콘텐츠 유형: 강의
- 주제: 서브쿼리의 개념과 유형, 비교 연산자, 상관 서브쿼리, 스칼라 서브쿼리, 인라인 뷰 및 뷰의 특징
- 서브쿼리는 SQL 문 안에 포함된 또 다른 SQL 문이다. 복잡한 조건이나 단계적인 조회를 하나의 문장으로 표현하는 데 사용되며, 실무와 데이터베이스 학습에서 모두 중요한 개념이다.
핵심 개념
- 메인 쿼리(외부 쿼리): 서브쿼리를 포함하는 바깥쪽 쿼리
- 서브쿼리(내부 쿼리): 메인 쿼리 안에 중첩된 쿼리
- 서브쿼리는 주로
WHERE절에서 사용되지만,SELECT,UPDATE,FROM절 등에서도 사용할 수 있다.
- 서브쿼리는 결과의 행 수, 열 수, 메인 쿼리와의 연관 여부에 따라 구분한다.
FROM절의 서브쿼리는 가상 테이블처럼 동작하므로 인라인 뷰라고 부른다.
상세 내용
1. 서브쿼리의 기본 구조
서브쿼리는 SQL 문 안에 다른 SQL 문을 넣어 사용한다. 예를 들어, 키가 가장 큰 선수의 정보를 조회하려면 다음 두 작업이 필요하다.
- 선수 테이블에서 최대 키를 구한다.
- 그 키와 같은 선수의 정보를 조회한다.
최대 키를 구하는 쿼리를 서브쿼리로 작성하고, 선수 정보를 조회하는 쿼리를 메인 쿼리로 작성하면 두 단계를 하나의 SQL 문으로 결합할 수 있다.
2. 서브쿼리의 구분
결과 행 수와 열 수 기준
서브쿼리는 다음 기준을 조합해 구분할 수 있다.
- 단일 행 / 다중 행: 결과가 최대 한 행인지, 여러 행이 나올 수 있는지
- 단일 열 / 다중 열: 결과가 한 열인지, 여러 열인지
따라서 단일 행·단일 열, 단일 행·다중 열, 다중 행·단일 열, 다중 행·다중 열의 네 가지 조합이 가능하다.
단일 행 서브쿼리
- 결과가 0행 또는 1행으로 제한되는 쿼리다.
=,>,<,>=,<=,<>와 같은 단일 행 비교 연산자를 사용할 수 있다.
- 결과가 실제 실행 시 2행 이상 나오면 런타임 오류가 발생할 수 있다.
- 특정 ID처럼 고유성이 보장되는 값으로 검색하면 단일 행 결과를 보장하기 쉽다.
- 이름처럼 중복될 수 있는 값으로 조회할 때는 여러 행이 나올 가능성을 고려해야 한다.
다중 행 서브쿼리
- 결과가 2행 이상 나올 가능성이 있는 쿼리다.
- 결과가 우연히 한 행만 나오더라도, 여러 행이 나올 수 있는 구조라면 다중 행 서브쿼리로 다루는 것이 적절하다.
- 여러 값과 비교할 때는
IN,ANY(SOME),ALL등의 다중 행 연산자를 사용한다.
3. 다중 행 비교 연산자
IN: 서브쿼리 결과 중 하나라도 일치하면 참이다. 여러 값 중 하나와 같은지 확인할 때 사용한다.
ANY/SOME: 비교 조건이 결과값 중 하나 이상에 대해 참이면 참이다. 예를 들어> ANY는 결과값 중 하나보다 크면 참이다.
ALL: 비교 조건이 모든 결과값에 대해 참이어야 한다. 예를 들어> ALL은 모든 결과값보다 커야 참이다.
EXISTS: 서브쿼리가 조건을 만족하는 행을 하나라도 반환하는지 확인한다. 결과값 자체보다 행의 존재 여부가 중요하다. 일반적으로SELECT 1처럼 값을 간단히 지정해 사용한다.
4. 단일 열·다중 열 서브쿼리
- 서브쿼리가 한 열을 반환하면 단일 열 서브쿼리, 여러 열을 반환하면 다중 열 서브쿼리다.
- 다중 열 서브쿼리의 결과와 비교할 때는 비교 대상의 열 개수와 순서가 서브쿼리 결과와 일치해야 한다.
- 예를 들어 키와 포지션을 함께 비교한다면 바깥쪽에서도 같은 순서로 키와 포지션을 비교해야 한다.
- 여러 행과 여러 열을 반환하는 경우에도 다중 행 연산자를 사용해 여러 결과 조합과 비교한다.
5. 상관 서브쿼리
- 상관 서브쿼리는 서브쿼리 안에서 메인 쿼리의 열을 참조하는 쿼리다.
- 예를 들어 각 직원의 급여를 해당 직원이 속한 부서의 평균 급여와 비교하려면, 메인 쿼리의 부서 번호를 서브쿼리에서 사용해 부서별 평균을 구할 수 있다.
- 이 경우 메인 쿼리의 현재 행이 서브쿼리 결과에 영향을 준다.
- 메인 쿼리의 열을 참조하지 않는 서브쿼리는 비상관 서브쿼리다.
- 상관 서브쿼리는 각 메인 쿼리 행에 대해 관련 결과를 구하는 구조다. 다만 실제 실행 순서와 방식은 데이터베이스의 최적화에 따라 달라질 수 있다.
- 메인 쿼리의 열은 서브쿼리에서 참조할 수 있지만, 서브쿼리에서 정의한 열을 메인 쿼리에서 직접 사용할 수 있는 것은 아니다. 인라인 뷰는 별도의 규칙을 따른다.
6. 스칼라 서브쿼리
- 단일 행·단일 열의 값을 반환하는 서브쿼리를 스칼라 서브쿼리라고 한다.
- 하나의 값을 반환하므로 함수처럼 값이 필요한 위치에서 사용할 수 있다.
SELECT,WHERE절뿐 아니라 함수의 인수 등에도 사용할 수 있다.
- 결과가 없으면 일반적으로
0이 아니라NULL로 처리된다.
- 예를 들어 직원 정보와 함께 각 직원의 부서명을 조회할 때, 부서 테이블에서 해당 부서명을 가져오는 서브쿼리를
SELECT절에 둘 수 있다. 다만 같은 목적은 조인으로 표현할 수도 있다.
7. 뷰와 인라인 뷰
뷰
- 뷰는
SELECT문을 저장해 테이블처럼 조회할 수 있게 만든 가상 테이블이다.
- 일반적인 뷰는 실제 데이터 자체를 저장하기보다 뷰를 정의하는 SQL 문을 저장한다. 뷰를 조회하면 데이터베이스가 정의된 쿼리를 이용해 결과를 반환한다.
- 테이블뿐 아니라 기존 뷰를 바탕으로 새 뷰를 만들 수도 있다.
뷰의 장점
- 독립성: 테이블 구조 변경을 뷰에 반영하면, 애플리케이션이 사용하는 조회 인터페이스를 유지하는 데 도움이 된다.
- 편리성: 복잡한 쿼리를 뷰 이름으로 단순화해 재사용할 수 있다.
- 보안성: 민감한 열을 제외한 뷰를 제공해 사용자가 볼 수 있는 정보를 제한할 수 있다.
인라인 뷰
FROM절에 직접 작성하는 서브쿼리를 인라인 뷰라고 한다.
- 일반 뷰처럼 테이블 역할을 하지만, 별도의 이름으로 정의해 저장하는 뷰와 달리 해당 SQL 문 안에서만 사용된다.
- 메인 쿼리에서는 인라인 뷰의
SELECT목록에 포함된 열만 참조할 수 있다.
- 인라인 뷰에서 원본 테이블의 열을 사용하려면, 메인 쿼리에서도 사용할 열을 인라인 뷰의
SELECT목록에 포함해야 한다.
서브쿼리를 작성할 때는 결과의 행 수와 열 수를 먼저 파악하고, 그에 맞는 비교 연산자를 선택해야 한다.