Database/SQL
[SQL] 서브 쿼리 (SubQuery) : (4) 스칼라 서브 쿼리 (단 하나의 값만 반환, SELECT절에 작성)
imnyoung
2026. 1. 7. 16:27

오늘은 스칼라 서브 쿼리에 대해 알아보려고 한다. 서브 쿼리 시리즈의 마지막 포스팅이다.
서브 쿼리 시리즈의 이전 글은 아래 링크를 참고하길 바란다.
[SQL] 서브 쿼리 (SubQuery) : (3) 인라인 뷰 (FROM절에 작성)
오늘은 서브 쿼리 중에서도 인라인 뷰에 대해 알아보도록 하자.서브 쿼리 시리즈의 다른 글은 아래 링크를 참고하길 바란다. [SQL] 서브 쿼리 (SubQuery) : (1) 기본 개념과 주요 예시1. 서브 쿼리란?하
imnyoungit.tistory.com
스칼라 서브쿼리(Scalar Subquery)란?
스칼라 서브쿼리는 단 하나의 값(1행 1열) 을 반환하는 서브쿼리이다. SELECT, WHERE, HAVING 절에서 일반 값처럼 사용할 수 있는 서브쿼리 중에서도 주로 SELECT절에서 사용되는 쿼리를 일반적으로 스칼라 서브쿼리라고 한다.
스칼라 서브쿼리의 기본 형태
스칼라 서브쿼리의 기본 형태는 다음과 같다.
SELECT 컬럼,
(SELECT 단일값 FROM ...)
FROM 테이블;
⚠️ 반드시 결과가 1행 1열 이어야 한다.
스칼라 서브쿼리의 사용 이유
[ 핵심 사용 이유 3가지 ]
1. 전체 평균/최대/최소 값을 각 행과 함께 보여줄 때
2. 기준값과의 차이를 계산할 때
3. JOIN 없이 문제를 가장 단순하게 표현하고 싶을 때

예시와 함께 살펴보자
예시 : FISH_INFO
다음과 같은 컬럼으로 구성된 FISH_INFO 테이블이 있다고 하자. (프로그래머스의 FISH_INFO 테이블과 동일)
| Column name | Type | Nullable | Description |
| ID | INTEGER | FALSE | 잡은 물고기의 ID |
| FISH_TYPE | INTEGER | FALSE | 물고기의 종류(숫자) |
| LENGTH | FLOAT | TRUE | 잡은 물고기의 길이(cm) |
| TIME | DATE | FALSE | 물고기를 잡은 날짜 |
잡은 물고기의 길이가 10cm 이하일 경우에는 LENGTH가 NULL 이며, LENGTH에 NULL 만 있는 경우는 없다.
1) 전체 평균/최대/최소 값을 각 행과 함께 보여주는 경우
문제 : 각 물고기의 길이와 함께 전체 물고기의 평균 길이, 최대 길이, 최소 길이를 같이 조회
SELECT id,
length,
(SELECT AVG(length) FROM fish_info) AS avg_length,
(SELECT MAX(length) FROM fish_info) AS max_length,
(SELECT MIN(length) FROM fish_info) AS min_length
FROM fish_info
WHERE length IS NOT NULL;
2) 기준값과의 차이를 계산할 때
문제 : 길이가 10cm 보다 큰 물고기 중 각 물고기의 길이가 전체 평균 길이보다 얼마나 큰지(또는 작은지) 계산하기
SELECT id,
length,
length - (SELECT AVG(length) FROM fish_info) AS diff_from_avg -- 스칼라 서브쿼리를 계산식 내부에서 사용
FROM fish_info
WHERE length IS NOT NULL;
3) JOIN 없이 문제를 가장 단순하게 표현하고 싶을 때
문제 : 10cm 초과인 물고기의 길이와 함께 전체 평균 길이를 기준으로 한 비율(%)을 조회
SELECT id,
length,
ROUND(
length / (SELECT AVG(length) FROM fish_info) * 100,
1
) AS length_ratio_percent
FROM fish_info
WHERE length IS NOT NULL;
기준 테이블이 자기 자신일 때 JOIN을 쓰면 오히려 쿼리가 길어진다.
이때 스칼라 서브쿼리를 이용하면 가독성 면에서 우수하다.
Reference