SQL

SUBQUERY 가능한 절 정리

초코너무조코 2025. 1. 23. 12:02
728x90

목차

     


    SUBQUERY (서브쿼리)는 다른 쿼리의 내부에 포함된 쿼리로, SELECT, FROM, WHERE, HAVING, INSERT, UPDATE, DELETE 등 다양한 SQL 절에서 사용할 수 있습니다.

    하지만 서브쿼리를 사용할 수 있는 절에는 약간의 제한이 있습니다. 각 절에서 서브쿼리를 사용할 수 있는지에 대해 구체적으로 설명하겠습니다.


    1. SELECT 절에서 서브쿼리 사용

    • 사용 가능: SELECT 절에서 서브쿼리를 사용하여 컬럼 값을 계산하거나 반환할 수 있습니다.
    • 예시: 특정 조건에 맞는 값을 서브쿼리로 가져오기
    SELECT 
        emp_name,
        (SELECT department FROM departments WHERE emp_id = employees.emp_id) AS emp_department
    FROM employees;
    
    • 설명: 이 쿼리는 employees 테이블에서 emp_name과 함께 서브쿼리를 사용하여 해당 직원의 부서명을 가져옵니다.

    2. FROM 절에서 서브쿼리 사용

    • 사용 가능: FROM 절에서 서브쿼리를 사용하면 서브쿼리 결과를 테이블처럼 취급할 수 있습니다. 이를 인라인 뷰 또는 서브쿼리 테이블이라고 부릅니다.
    • 예시: 서브쿼리 결과를 테이블처럼 사용
    SELECT dept_name, COUNT(*) AS emp_count
    FROM (SELECT department AS dept_name FROM employees) AS subquery
    GROUP BY dept_name;
    
    • 설명: employees 테이블에서 서브쿼리를 사용해 부서명을 추출한 후, 해당 결과를 이용해 각 부서의 직원 수를 구합니다.

    3. WHERE 절에서 서브쿼리 사용

    • 사용 가능: WHERE 절에서 서브쿼리를 사용하여 조건을 지정할 수 있습니다. 서브쿼리가 단일 값을 반환하면 =, IN, EXISTS 등의 연산자와 함께 사용됩니다.
    • 예시: 특정 부서에 속하는 직원 찾기
    SELECT emp_name
    FROM employees
    WHERE department_id IN (SELECT department_id FROM departments WHERE dept_name = 'Sales');
    
    • 설명: 서브쿼리를 사용하여 departments 테이블에서 'Sales' 부서의 department_id를 찾고, 이를 employees 테이블에서 사용하여 해당 부서에 속한 직원들의 이름을 조회합니다.

    4. HAVING 절에서 서브쿼리 사용

    • 사용 가능: HAVING 절에서도 서브쿼리를 사용할 수 있습니다. 보통 집계 함수와 함께 조건을 설정할 때 사용됩니다.
    • 예시: 평균 급여가 특정 금액 이상인 부서 찾기
    SELECT department_id, AVG(salary)
    FROM employees
    GROUP BY department_id
    HAVING AVG(salary) > (SELECT AVG(salary) FROM employees);
    
    • 설명: 서브쿼리에서 모든 직원의 평균 급여를 계산하고, 이를 사용하여 평균 급여가 그보다 높은 부서만을 필터링합니다.

    5. INSERT 절에서 서브쿼리 사용

    • 사용 가능: INSERT 문에서 서브쿼리를 사용하여 다른 테이블로 데이터를 삽입할 수 있습니다.
    • 예시: 다른 테이블에서 데이터를 삽입
    INSERT INTO employees_backup (emp_id, emp_name, department_id)
    SELECT emp_id, emp_name, department_id
    FROM employees
    WHERE hire_date < '2020-01-01';
    
    • 설명: employees 테이블에서 2020년 1월 1일 이전에 입사한 직원들의 데이터를 employees_backup 테이블에 삽입합니다.

    6. UPDATE 절에서 서브쿼리 사용

    • 사용 가능: UPDATE 문에서도 서브쿼리를 사용하여 값을 갱신할 수 있습니다. 서브쿼리는 보통 SET 절이나 WHERE 절에서 사용됩니다.
    • 예시: 특정 직원의 급여를 부서별 평균 급여로 업데이트
    UPDATE employees
    SET salary = (SELECT AVG(salary) FROM employees WHERE department_id = employees.department_id)
    WHERE department_id = 10;
    
    • 설명: 부서 ID가 10인 직원들의 급여를 해당 부서의 평균 급여로 업데이트하는 쿼리입니다.

    7. DELETE 절에서 서브쿼리 사용

    • 사용 가능: DELETE 문에서 서브쿼리를 사용하여 조건에 맞는 데이터를 삭제할 수 있습니다.
    • 예시: 특정 부서의 직원을 삭제
    DELETE FROM employees
    WHERE department_id IN (SELECT department_id FROM departments WHERE dept_name = 'HR');
    
    • 설명: 'HR' 부서에 속한 직원들을 삭제하는 쿼리입니다.

    8. 서브쿼리 사용 불가능한 곳

    • ORDER BY 절에서는 서브쿼리 사용이 불가능합니다.
      • 이유는 ORDER BY는 결과 집합을 정렬하는 데 사용되며, 그 자체로 조건을 설정하는 데 사용되지 않기 때문입니다.
    • 예시 (잘못된 예시):
    SELECT emp_id, emp_name
    FROM employees
    ORDER BY (SELECT department FROM departments WHERE dept_id = employees.dept_id);
    
    • 이 쿼리는 서브쿼리에서 반환된 값으로 정렬하려는 시도이지만, SQL에서는 ORDER BY에서 서브쿼리를 사용할 수 없습니다.

    정리

    • 모든 절에서 서브쿼리를 사용할 수 있습니다:
      • SELECT: SELECT 결과로 사용
      • FROM: 서브쿼리를 테이블처럼 사용
      • WHERE: 조건을 설정하는 데 사용
      • HAVING: 집계 함수와 함께 사용
      • INSERT: 다른 테이블에서 데이터를 삽입
      • UPDATE: 값을 갱신
      • DELETE: 데이터를 삭제
    • ORDER BY 절에서는 서브쿼리를 사용할 수 없습니다.

     

    728x90

    'SQL' 카테고리의 다른 글

    NVL 함수와 COALESCE 함수  (0) 2025.01.23
    UNION ALL에 대하여  (0) 2025.01.23
    아웃터 조인 (Outer Join)  (0) 2025.01.23
    SQL -AS 사용 가능한 곳  (0) 2025.01.23
    SQL의 SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY 쉽게 이해하기  (2) 2025.01.23