✅ 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 = 행/열 제한 없이 테이블처럼 반환
그래서 “쓰는 위치”, “허용되는 결과 형태”가 완전히 달라진다.
'DB + SQL' 카테고리의 다른 글
| [Oracle] - Oracle Package (0) | 2025.11.19 |
|---|---|
| Android에서 로컬 데이터베이스 접근하기 (0) | 2025.10.24 |
| java.sql.SQLSyntaxErrorException: Connection.setNetworkTimeout cannot be called on a closed connection (0) | 2025.09.08 |
| SQL - WITH 사용법 (1) | 2024.02.02 |
| SQL - COALESCE (0) | 2023.11.07 |