스칼라 서브쿼리(Scalar Subquery)는 단일 값을 반환하는 서브쿼리입니다.
즉, SELECT 문이 실행될 때 하나의 행과 하나의 열(단일 값)만 반환하는 서브쿼리를 의미합니다.
- 일반적으로 SELECT 절, WHERE 절, HAVING 절, 또는 ORDER BY 절에서 사용됩니다.
- 반환된 값이 단 하나의 값이므로 스칼라(Scalar) 값이라고 부릅니다.
1. 스칼라 서브쿼리의 특징
✔ 반환 값이 반드시 하나(1개 행, 1개 열)
✔ 메인 쿼리의 컬럼과 함께 사용할 수 있음
✔ 각 행마다 실행될 수 있어 성능 저하 가능
✔ NULL을 반환할 수도 있음
2. 스칼라 서브쿼리의 사용 예제
1) SELECT 절에서 사용
- 특정 컬럼의 값을 계산하여 반환할 때 사용
SELECT emp_id, name,
(SELECT AVG(salary) FROM salaries WHERE emp_id = e.emp_id) AS avg_salary
FROM employees e;
✅ 각 직원(emp_id)에 대한 평균 급여(avg_salary)를 반환
✅ 각 행마다 서브쿼리가 실행됨(성능 고려 필요)
2) WHERE 절에서 사용
- 특정 조건을 만족하는 데이터를 필터링할 때 사용
SELECT emp_id, name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
✅ 전체 직원 평균 급여보다 높은 급여를 가진 직원 검색
3) HAVING 절에서 사용
- 그룹별 필터링에 활용
SELECT department, AVG(salary)
FROM employees
GROUP BY department
HAVING AVG(salary) > (SELECT AVG(salary) FROM employees);
✅ 전체 평균 급여보다 높은 부서만 표시
4) ORDER BY 절에서 사용
- 특정 기준으로 정렬할 때 활용
SELECT emp_id, name, salary
FROM employees
ORDER BY (SELECT department_name FROM departments WHERE dept_id = employees.dept_id);
✅ 부서 이름 기준으로 정렬
3. 스칼라 서브쿼리의 장점과 단점
✅ 장점
✔ 단순하고 직관적 (서브쿼리를 활용하여 값을 쉽게 조회 가능)
✔ 다양한 SQL 절에서 사용 가능
✔ 단일 값 반환으로 컬럼처럼 활용 가능
❌ 단점
❌ 각 행마다 서브쿼리를 실행해야 하므로 성능이 저하될 수 있음
❌ 여러 개의 값을 반환하면 오류 발생 (Subquery returns more than 1 row
오류)
4. 스칼라 서브쿼리 최적화 방법
1️⃣ 인덱스 활용
- 서브쿼리에서 자주 조회하는 컬럼에 인덱스를 추가하면 속도 개선 가능
2️⃣ JOIN으로 대체
- 서브쿼리 대신 JOIN을 사용하면 성능 개선 가능
SELECT e.emp_id, e.name, s.avg_salary
FROM employees e
LEFT JOIN (SELECT emp_id, AVG(salary) AS avg_salary FROM salaries GROUP BY emp_id) s
ON e.emp_id = s.emp_id;
✅ 스칼라 서브쿼리 대신 조인을 사용하여 성능 개선
3️⃣ 서브쿼리 결과를 CTE(공통 테이블 표현식)로 변경
- CTE(Common Table Expression)를 활용하여 중복 실행을 방지
WITH avg_salaries AS (
SELECT emp_id, AVG(salary) AS avg_salary FROM salaries GROUP BY emp_id
)
SELECT e.emp_id, e.name, a.avg_salary
FROM employees e
LEFT JOIN avg_salaries a
ON e.emp_id = a.emp_id;
5. 결론
- 스칼라 서브쿼리는 단일 값을 반환하는 서브쿼리로, SELECT, WHERE, HAVING, ORDER BY 등에서 사용 가능
- 각 행마다 서브쿼리가 실행되기 때문에 성능 저하 가능성이 있음
- JOIN 또는 CTE를 활용하여 성능 최적화를 고려하는 것이 중요