hanker

SQL - 서브쿼리 사용법 (서브쿼리 활용 방법) 본문

DATABASE/SQL

SQL - 서브쿼리 사용법 (서브쿼리 활용 방법)

hanker 2025. 1. 3. 00:00
반응형

SQL에서 서브쿼리는 쿼리 안에 중첩된 또 다른 쿼리를 의미한다.

이를 통해 복잡한 데이터 처리를 간결하고 유연하게 구현할 수 있다.

서브쿼리는 SELECT, INSERT, UPDATE, DELETE와 함께 사용되며, 다양한 방식으로 활용 가능하다.

이번 글에서는 서브쿼리의 정의와 활용 방법을 알아보자!

 


1. 서브쿼리란?

 

서브쿼리는 주 쿼리(main query) 내에서 중첩된 쿼리로, 주로 임시 데이터 처리를 위해 사용된다.

 

서브쿼리의 주요 특징은

- 소괄호 ( )로 감싸져야 한다.

- 주 쿼리에 데이터를 제공하거나 조건을 정의한다.

 

예제를 통해 더 자세히 알아보자.

 


2. 서브쿼리의 유형

 

2.1 스칼라 서브쿼리 (Scalar Subquery)

한 행과 한 열을 반환하여 주 쿼리의 값으로 사용된다.

SELECT name, 
       (SELECT AVG(salary) FROM employees) AS average_salary
FROM employees;
# 결과: 모든 직원의 이름과 평균 급여를 출력한다.

 

 

2.2 다중 행 서브쿼리 (Multi-row Subquery)

여러 행을 반환하며, 주로 IN, ANY, ALL과 함께 사용된다.

SELECT name
FROM employees
WHERE department_id IN (SELECT department_id FROM departments WHERE location_id = 100);
# 결과: 특정 위치(location_id = 100)에 속한 부서의 직원 이름을 반환

 

 

2.3 다중 열 서브쿼리 (Multi-column Subquery)

여러 열을 반환하며, 주로 EXISTS 또는 비교를 위해 사용된다.

SELECT name
FROM employees E
WHERE (E.department_id, E.salary) IN (
    SELECT department_id, MAX(salary)
    FROM employees
    GROUP BY department_id
);
# 결과: 각 부서에서 가장 높은 급여를 받는 직원의 이름을 반환

 

 

2.4 상관 서브쿼리 (Correlated Subquery)

상관 서브쿼리는 주 쿼리의 데이터를 참조하여 실행되며, 반복적으로 수행한다.

SELECT name
FROM employees E
WHERE salary > (
    SELECT AVG(salary)
    FROM employees
    WHERE department_id = E.department_id
);
# 결과: 각 부서의 평균 급여보다 높은 급여를 받는 직원의 이름을 반환

 

 


3. INSERT / UPDATE / DELETE 구문의 서브쿼리 사용

 

3.1 INSERT와 함께 사용

새로운 데이터를 삽입할 때의 서브쿼리 사용

INSERT INTO high_earners (employee_id, name)
SELECT employee_id, name
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
# 결과: 평균 급여를 초과하는 직원 데이터를 high_earners 테이블에 삽입

 

 

3.2 UPDATE와 함께 사용

특정 조건에 따라 데이터를 업데이트할 때 사용

UPDATE employees
SET salary = salary * 1.1
WHERE department_id = (
    SELECT department_id
    FROM departments
    WHERE location_id = 100
);
# 결과: 위치 ID가 100인 부서의 직원 급여를 10% 인상

 

 

3.3 DELETE와 함께 사용

조건에 따라 데이터를 삭제할 때 활용

DELETE FROM employees
WHERE department_id IN (
    SELECT department_id
    FROM departments
    WHERE location_id = 200
);
# 결과: 위치 ID가 200인 부서의 직원 데이터를 삭제

 

 


4. 서브쿼리와 JOIN의 차이

 

서브쿼리와 JOIN은 모두 데이터를 결합하거나 처리할 때 사용되지만, 다음과 같은 차이점이 있다.

특징 서브쿼리 join
사용 방식 중첩된 쿼리로 처리 테이블 간 직접 결합
성능 복잡한 경우 성능 저하 가능 대용량 데이터 처리에 더 적합
가독성 간단한 경우 가독성이 좋음 데이터 흐름이 명확함
유연성 특정 조건 처리에 적합 여러 테이블 간 데이터 연결에 적합

 


5. 서브쿼리 주의점!

 

 

성능: 서브쿼리가 반복 실행되면 성능 저하를 초래할 수 있으므로, 적절히 최적화해야 한다.

가독성: 복잡한 서브쿼리는 읽기 어렵기 때문에, 가능한 경우 JOIN으로 대체하거나 뷰(View)를 사용하는 것이 좋다.

데이터베이스 호환성: 일부 서브쿼리 문법은 특정 데이터베이스에서만 지원된다.

 

 

 

 

끝.

 

반응형