[DB] 서브쿼리 (Subquery)

·2025년 1월 7일

데이터베이스

목록 보기
12/22
post-thumbnail

서브쿼리(Subquery)란?

  • 하나의 쿼리에 포함된 또 다른 SELETE문을 의미
  • 서브쿼리는 괄호로 감싸야함
  • 주로 데이터 조회, 필터링, 계산 등 다양한 상황에서 활용

서브쿼리 종류

스칼라 서브쿼리

  • 서브쿼리 결과로 반드시 하나의 행만을 반환
  • SELECT 절에서 컬럼값으로 사용
  • 데이터의 양이 많을수록 실행속도가 느려지기 때문에 주의
// SELECT
SELECT employee_id, 
       (SELECT department_name  // 서브쿼리 START
        FROM departments 
        WHERE departments.department_id = employees.department_id) AS department_name // 서브쿼리 END
FROM employees;

// WHERE
SELECT employee_id, name, salary
FROM employees
WHERE salary > (
    SELECT AVG(salary)
    FROM employees
    WHERE department_id = 10
);

인라인 뷰(Inline View)

  • 메인 쿼리의 FROM 절에서 사용하는 서브쿼리
  • 즉, 서브쿼리 자체가 하나의 테이블처럼 사용 되는 것 => 뷰(View)처럼 사용
  • 여러 개의 컬럼이나 행을 반환할 수 있음
  • 서브쿼리 결과를 별칭(alias)으로 참조해야함
SELECT department_id, AVG(salary) AS avg_salary
FROM (SELECT department_id, salary FROM employees WHERE salary > 5000) high_salary_employees
GROUP BY department_id;

중첩 서브쿼리(Nested Sub Query)

  • WHERE절에서 조건절의 일부로 사용하는 서브쿼리
  • 즉, 메인쿼리 테이블의 컬럼값과 비교할때 주로 사용
  • 인라인 뷰처럼 여러 개의 컬럼, 여러 개의 행을 반환할 수 있음
// 단일 행
SELECT * 
FROM employees 
WHERE department_id = (SELECT department_id FROM departments WHERE department_name = 'Sales');

// 다중 행
SELECT * 
FROM employees 
WHERE department_id IN (SELECT department_id FROM departments WHERE location_id = 100);

// 다중 컬럼
SELECT e.*
FROM employees e
WHERE (e.department_id, e.location_id) IN (
    SELECT department_id, location_id
    FROM departments
    WHERE location_id = 100
);

0개의 댓글