SQL을 이용해 데이터 분석을 하다보면 복잡한 문제를 해결해야 하는 상황이 오곤 합니다.
단순이 조건이나 JOIN만으로 해결하기 어려운 데이터 추출이 필요할 때가 있는데요.
이런 상황에서는 SQL서브쿼리(subquery)를 사용하는 것이 필수적입니다!
서브쿼리를 활용하면 기본 쿼리의 결과를 더욱 효과적으로 사용해 다양한 조건에 맞는 데이터를 추출할 수 있습니다.
이번에는 SQL서브쿼리의 개념과 다양한 사용 사례를 통해 그 활용법을 자세히 알아보겠습니다.
1. 서브쿼리란?
SQL에서 서브쿼리는 주 쿼리(Main query) 내부에서 실행되는 쿼리를 말합니다.
서브쿼리는 주로 SELECT, INSERT, UPDATE, DELETE문 내에서 사용하며,
하나의 쿼리 결과를 다른 쿼리의 조건으로 사용할 때 주로 사용합니다.
또한 서브쿼리는 단일 행 또는 다중 행 결과를 반환할 수 있는데, 이에 따라 사용 방법이 달라집니다.
2. 단일 행 서브쿼리
단일 행 서브쿼리는 하나의 행만을 반환하며, 주로 비교 연산자(=, <, > 등)와 함께 사용합니다.
예를 들어 특정 직원보다 많은 급여를 받는 직원의 목록을 조회하고 싶을 때 사용할 수 있습니다.
SELECT employees_name, salary
FROM employees
WHERE salary > (SELECT salary FROM employees WHERE name = '홍길동');
이 쿼리는 홍길동 직원보다 높은 급여를 받는 직원의 이름과 급여 리스트를 확인할 수 있습니다.
3. 다중 행 서브쿼리
다중 행 서브쿼리는 여러 행을 반환할 수 있으며 IN, ANY ALL과 같은 연산자와 함께 사용합니다.
예를 들어 특정 부서에서 일하는 직원들의 평균 급여보다 많이 받는 직원들을 찾는 쿼리를 작성해보겠습니다.
SELECT employees_name, salary
FROM employees
WHERE salary > ALL (SELECT AVG(salary) FROM employees GROUP BY department);
이 쿼리를 통해 각 부서의 평균 급여보다 많은 급여를 받는 직원들의 목록을 확인할 수 있습니다.
4. 서브쿼리를 사용한 JOIN
서브쿼리는 JOIN 연산에서도 유용하게 사용할 수 있습니다.
예를 들어 각 부서의 최고 급여를 받는 직원의 정보를 찾을 때도 서브쿼리를 활용할 수 있습니다.
SELECT e.name, e.salary, e.department
FROM employees AS e
INNER JOIN(
SELECT department, MAX(salary) AS max_salary
FROM employees
GROUP BY department
) max_salaries ON e.department = max_salaries.department
AND e.salary = max_salaries.max_salary;
이렇게 쿼리를 작성하면 각 부서에서 가장 많은 급여를 받는 직원들의 이름, 급여, 부서 정보를 반환하게 됩니다.
정리
서브쿼리는 SQL 쿼리문에서 꼭 필요한 강력한 방식입니다.
복잡한 데이터 관계를 효과적으로 다루고 보다 정교하게 데이터를 추출할 수 있게 되어
데이터 분석 결과를 더욱 향상시키도록 합니다.
SQL 서브쿼리의 다양한 활용 사례를 이해하고 연습하다보면 데이터 분석 능력을 더욱 키울 수 있게 되므로
서브쿼리 사용법을 꼭! 숙지하고 다양한 문제 해결에 적용해보시기 바랍니다.