서브쿼리

개발자되고싶은데·2025년 11월 13일

서브쿼리(Subquery)란?

서브쿼리는 다른 SQL 쿼리 안에 중첩된 SELECT 문입니다. 메인 쿼리의 결과를 얻기 위해 보조적인 역할을 하며, 괄호 () 안에 작성됩니다.

서브쿼리의 종류

1. 단일 행 서브쿼리

하나의 행만 반환하는 서브쿼리입니다.

-- 평균 급여보다 높은 급여를 받는 직원 찾기
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

2. 다중 행 서브쿼리

여러 행을 반환하며, IN, ANY, ALL 등의 연산자와 함께 사용됩니다.

-- IT 부서에 속한 직원들 찾기
SELECT name
FROM employees
WHERE department_id IN (
    SELECT id FROM departments WHERE name = 'IT'
);

3. 스칼라 서브쿼리

SELECT 절에 사용되어 단일 값을 반환합니다.

SELECT name, 
       salary,
       (SELECT AVG(salary) FROM employees) AS avg_salary
FROM employees;

4. 상관 서브쿼리 (Correlated Subquery)

외부 쿼리의 값을 참조하는 서브쿼리입니다.

-- 각 부서에서 평균 급여보다 높은 직원 찾기
SELECT e1.name, e1.department_id, e1.salary
FROM employees e1
WHERE salary > (
    SELECT AVG(salary) 
    FROM employees e2 
    WHERE e2.department_id = e1.department_id
);

서브쿼리 사용 위치

WHERE 절

SELECT * FROM products
WHERE price > (SELECT AVG(price) FROM products);

FROM 절 (인라인 뷰)

SELECT dept_name, avg_sal
FROM (
    SELECT department_id, AVG(salary) as avg_sal
    FROM employees
    GROUP BY department_id
) subquery
JOIN departments ON subquery.department_id = departments.id;

HAVING 절

SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id
HAVING AVG(salary) > (SELECT AVG(salary) FROM employees);

서브쿼리 vs JOIN

같은 결과를 얻을 수 있지만 상황에 따라 선택합니다:

서브쿼리가 적합한 경우:

  • 집계 함수 결과와 비교할 때
  • 존재 여부만 확인할 때 (EXISTS)
  • 쿼리 로직이 더 명확할 때

JOIN이 적합한 경우:

  • 여러 테이블의 컬럼을 함께 조회할 때
  • 성능이 중요할 때 (일반적으로 JOIN이 더 빠름)

주의사항

  • 서브쿼리는 성능에 영향을 줄 수 있으므로, 복잡한 경우 JOIN이나 임시 테이블 고려
  • 단일 행을 반환해야 하는 곳에 다중 행 서브쿼리를 사용하면 오류 발생
  • 상관 서브쿼리는 외부 쿼리의 각 행마다 실행되므로 성능 주의

느낀점

서브쿼리랑 JOIN 중 적합한 것을 고르는 기준을 확립해야할 것 같다.

0개의 댓글