서브쿼리(Subquery)

Yunsung·2024년 12월 16일
post-thumbnail

📝 서브쿼리란?

서브쿼리란 SQL 쿼리 안에 포함된 또 다른 쿼리를 의미합니다. 주로 특정 조건에 맞는 데이터를 추출하거나 결과를 가공할 때 사용됩니다.
서브쿼리는 중첩 서브쿼리, 인라인 뷰, 스칼라 서브쿼리로 나눌 수 있으며, 단일 행, 다중 행, 다중 컬럼 등의 형태로도 구분됩니다.

🔍 서브쿼리 유형

1. 중첩 서브쿼리 (Nested Subquery)

  • 다른 쿼리의 내부에 포함된 쿼리입니다.

  • WHERE, HAVING, SELECT 절에서 사용될 수 있습니다.

    1.1 단일 행 서브쿼리 (Single-row Subquery)

    서브쿼리가 하나의 값만 반환합니다. 비교 연산자(=, >, <, >=, <=)와 함께 사용됩니다.

    SELECT emp_name, salary
    FROM employees
    WHERE salary > (SELECT AVG(salary) FROM employees);

    설명: 이 쿼리는 직원들의 이름과 급여를 조회합니다. 서브쿼리는 employees 테이블에서 평균 급여를 계산하고, 이 값을 기준으로 평균 급여보다 많은 급여를 받는 직원들을 반환합니다.


    1.2 다중 행 서브쿼리 (Multiple-row Subquery)

    서브쿼리가 여러 개의 값을 반환합니다. 주로 IN, ANY, ALL 연산자와 함께 사용됩니다.

    SELECT emp_name, department
    FROM employees
    WHERE department IN (SELECT department FROM employees WHERE salary > 5000);

    설명: 이 쿼리는 급여가 5000 이상인 직원들이 속한 부서에서 일하는 모든 직원들을 조회합니다. 서브쿼리는 급여가 5000 이상인 직원들의 부서를 찾고, 그 부서에 속한 직원들을 반환합니다.

    1.3 다중 컬럼 서브쿼리 (Multiple-column Subquery)

    서브쿼리가 여러 개의 컬럼을 반환합니다. 주로 WHERE 조건에서 여러 컬럼을 비교할 때 사용됩니다.

    SELECT emp_name  
    FROM employees  
    WHERE (department, salary) IN (SELECT department, MAX(salary)  
                                  FROM employees  
                                  GROUP BY department);

    설명: 각 부서의 최고 급여를 받는 직원들의 이름을 조회합니다.

2. 인라인 뷰 (Inline View)

서브쿼리를 FROM 절에서 사용하여 일시적인 테이블처럼 활용하는 방법입니다.

SELECT department, AVG(salary) AS avg_salary  
FROM (SELECT department, salary  
      FROM employees) AS subquery  
GROUP BY department;  

설명: employees 테이블의 일부 데이터를 인라인 뷰로 사용하고, 각 부서의 평균 급여를 구합니다.

3. 스칼라 서브쿼리 (Scalar Subquery)

서브쿼리가 단일 값을 반환하고, SELECT 절이나 WHERE 절에서 사용됩니다.

SELECT emp_name, salary, (SELECT AVG(salary) FROM employees) AS overall_avg  
FROM employees;  

설명: 각 직원의 이름과 급여를 보여주며, 전체 직원 평균 급여도 함께 반환합니다.

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

  • 서브쿼리가 메인 쿼리의 각 행마다 반복 실행됩니다.
  • 서브쿼리 내부에서 메인 쿼리의 값을 참조합니다.
SELECT emp_name  
FROM employees e1  
WHERE EXISTS (SELECT 1  
              FROM employees e2  
              WHERE e1.department = e2.department  
              AND e2.salary > 5000);  

설명: 각 직원의 부서에 급여가 5000 이상인 다른 직원이 있는 경우, 해당 직원을 반환합니다.



📊 서브쿼리 사용 목적과 장점

  1. 복잡한 조건 처리 : 서브쿼리를 사용하면 한 번에 여러 조건을 처리할 수 있어, 복잡한 SQL 로직을 쉽게 해결할 수 있습니다.
  2. 가독성 향상 : 서브쿼리를 사용하여 복잡한 조건식을 분리하면 쿼리의 가독성이 향상됩니다.
  3. 성능 최적화 : 서브쿼리는 주로 필요한 데이터만을 추출하기 때문에 불필요한 데이터를 처리하는 비용을 줄여 성능을 최적화할 수 있습니다.


⚠️ 서브쿼리 주의사항

  1. 성능 문제 : 서브쿼리는 메인 쿼리가 실행될 때마다 여러 번 실행되므로 성능에 영향을 미칠 수 있습니다. 이를 해결하려면 조인을 사용하는 것이 더 효율적일 수 있습니다.
  2. 가독성 저하 : 너무 복잡한 서브쿼리를 여러 번 사용하면 쿼리의 가독성이 떨어질 수 있습니다. 가능한 한 쿼리의 단계를 분리하여 유지보수를 용이하게 해야합니다.
profile
풀스택 개발자로서의 도전을 하는 중입니다. 많은 응원 부탁드립니다!!😁

0개의 댓글