Every Step Matters

[SQL] 서브 쿼리 (SubQuery) : (4) 스칼라 서브 쿼리 (단 하나의 값만 반환, SELECT절에 작성) 본문

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

https://inpa.tistory.com/396#%EC%8A%A4%EC%B9%BC%EB%9D%BC_%EC%84%9C%EB%B8%8C%EC%BF%BC%EB%A6%AC_scalar_subquery_

https://juntcom.tistory.com/240#google_vignette