데이터베이스

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

zerg96

Recent Posts

요양원 선택 전 반드시 확인해야 할 것들, 부모님 맡기기 전에 보세요

요양원 선택 전 반드시 확인해야 할 체크리스트를 공개합니다. 공식 평가 자료 조회법, 방문 시 확인…

2일 ago

공공기관 채용 비리, 내부에서 터져나온 충격 증언

공공기관 채용 비리의 실태와 피해 지원자의 대응법을 정리했습니다. 채용 비리 신고 방법, 공익신고자 보호제도, 취준생…

2일 ago

주식 손실 났을 때 세금 줄이는 방법, 아는 사람만 씁니다

주식 손실을 세금 절약에 활용하는 합법적 방법을 공개합니다. 해외주식 손익통산, ISA 계좌 활용, 연금계좌 절세까지…

2일 ago

음식 배달 늦으면 소비자가 취소할 수 있다, 몰랐던 권리

배달이 예상 시간보다 크게 늦으면 취소·환불을 요청할 수 있습니다. 배달앱별 지연 취소 방법과 잘못 배달됐을…

2일 ago

휴대폰 요금제 바꾸면 연 수십만원 절약, 지금 내 요금제 확인하세요

통신비 절약의 핵심은 요금제 최적화입니다. 내 데이터 사용량 확인법, 알뜰폰 전환 비교, 위약금 없이 요금제…

2일 ago

퇴직금 못 받았다면, 지금 당장 이렇게 하세요

퇴직 후 퇴직금을 받지 못했다면 즉시 노동부에 신고하세요. 지급 기한, 자격 요건, 신고 방법, 소액체당금…

2일 ago