Scaler Subquery와 Subquery

✅ 1. Scalar Subquery란?

단 하나의 값(One Value) 만 반환하는 서브쿼리.

  • 결과가 1행 1열이어야 함
  • 어떤 위치든 값이 들어갈 수 있는 곳이면 쓸 수 있음
    → SELECT, WHERE, CASE WHEN, INSERT VALUE, UPDATE SET 등
  • 반환값이 변수처럼 사용됨

예시

 
SELECT name, (SELECT MAX(salary) FROM employee) AS max_salary FROM department;

위의 SELECT MAX(salary) FROM employee 부분이 스칼라 서브쿼리
→ 딱 한 값만 나오니까 컬럼처럼 사용 가능함.


✅ 2. Ordinary Subquery(일반 Subquery)는?

스칼라가 아닌 나머지.
예를 들어:

단일 열이지만 여러 행 반환

 
SELECT name FROM employee WHERE dept_id IN (SELECT id FROM department);

여러 열·여러 행 반환(테이블 형태)

 
SELECT * FROM employee e WHERE EXISTS (SELECT 1 FROM department d WHERE d.id = e.dept_id);

즉, 일반 서브쿼리는 반환 결과가 제약 없음.
테이블 형태 전체, 여러 행 등 자유로움.


✅ 3. 가장 중요한 차이 정리표

구분Scalar Subquery일반 Subquery
반환값 1행 1열(딱 한 값) 여러 행 여러 열 가능
사용 위치 값이 필요한 곳 어디든 가능 주로 IN, EXISTS, FROM, JOIN, WHERE
실패 조건 결과가 2개 이상 나오면 에러 문제 없음
쓰는 목적 단일 값을 구해서 컬럼처럼 쓰기 조건 필터링, 존재 여부, 조인 대체

✅ 4. Scalar Subquery가 실패하는 경우

 
SELECT name, (SELECT salary FROM employee WHERE dept_id = 10) FROM department;

여기서 dept_id = 10 직원이 2명 이상이면?

❌ subquery returns more than one row 에러 발생
→ scalar 는 단 하나의 값만 허용하니까.


✅ 5. Scalar Subquery가 많이 쓰이는 패턴

▷ SELECT에서 컬럼처럼 사용

 
SELECT name, (SELECT COUNT(*) FROM order o WHERE o.user_id = u.id) FROM users u;

▷ UPDATE에서 값으로 사용

 
UPDATE employee SET salary = (SELECT AVG(salary) FROM employee);

📌 한줄 요약

Scalar Subquery = 단 하나의 값만 반환하는 서브쿼리
일반 Subquery = 행/열 제한 없이 테이블처럼 반환

그래서 “쓰는 위치”, “허용되는 결과 형태”가 완전히 달라진다.