스칼라 서브쿼리(Scalar Subquery)

스칼라 서브쿼리(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를 활용하여 성능 최적화를 고려하는 것이 중요

Leave a Comment