서브쿼리의 개념과 활용 (Concept and Usage of Subqueries)
서브쿼리는 SQL 문장 내에 포함된 또 다른 SQL 쿼리입니다. 주 쿼리의 결과를 도출하기 위해 사용되며, 다양한 방식으로 데이터를 필터링하거나 변환하는 데 활용됩니다.
서브쿼리의 기본 구조
서브쿼리는 소괄호 ()
로 둘러싸여 있으며, 주로 SELECT, FROM, WHERE 절에서 사용됩니다.
SELECT column1 FROM table_name WHERE column2 = (SELECT column2 FROM another_table WHERE condition);
예제:
SELECT first_name, last_name FROM employees WHERE department_id = (SELECT department_id FROM departments WHERE department_name = 'Sales');
이 예제에서는 departments
테이블에서 ‘Sales’ 부서의 department_id
를 서브쿼리로 가져와, employees
테이블에서 해당 부서에 속한 직원들의 이름을 조회합니다.
서브쿼리의 종류 (Types of Subqueries)
스칼라 서브쿼리 (Scalar Subquery)
스칼라 서브쿼리는 단일 값(하나의 행과 하나의 열)을 반환하는 서브쿼리입니다. 주로 SELECT 절 또는 WHERE 절에서 사용됩니다.
SELECT column1, (SELECT column2 FROM another_table WHERE condition) AS alias_name FROM table_name;
예제:
SELECT first_name, last_name, (SELECT department_name FROM departments WHERE department_id = employees.department_id) AS department_name FROM employees;
이 예제에서는 employees
테이블의 각 직원에 대해 departments
테이블에서 department_name
을 가져와 함께 조회합니다.
인라인 뷰 (Inline View)
인라인 뷰는 FROM 절에서 서브쿼리를 사용하여 일시적인 뷰를 생성하는 것입니다. 이는 주 쿼리에서 사용할 데이터를 동적으로 생성할 때 유용합니다.
SELECT alias_name.column1, alias_name.column2 FROM (SELECT column1, column2 FROM table_name WHERE condition) alias_name;
예제:
SELECT temp.first_name, temp.last_name, temp.total_sales FROM (SELECT e.first_name, e.last_name, SUM(s.amount) AS total_sales FROM employees e JOIN sales s ON e.employee_id = s.employee_id GROUP BY e.first_name, e.last_name) temp WHERE temp.total_sales > 10000;
이 예제에서는 인라인 뷰를 사용하여 각 직원의 총 매출액을 계산하고, 총 매출액이 10,000을 초과하는 직원들의 이름과 총 매출액을 조회합니다.
다른 서브쿼리 예제들
EXISTS를 사용한 서브쿼리 (Subquery with EXISTS)
EXISTS 서브쿼리는 서브쿼리의 결과가 존재하는지 여부를 체크합니다.
SELECT column1 FROM table_name WHERE EXISTS (SELECT 1 FROM another_table WHERE condition);
예제:
SELECT first_name, last_name FROM employees e WHERE EXISTS (SELECT 1 FROM departments d WHERE d.department_id = e.department_id AND d.department_name = 'Sales');
이 예제에서는 ‘Sales’ 부서에 속한 직원들을 조회합니다.
IN을 사용한 서브쿼리 (Subquery with IN)
IN 서브쿼리는 서브쿼리의 결과 집합에 값이 포함되어 있는지를 체크합니다.
SELECT column1 FROM table_name WHERE column2 IN (SELECT column2 FROM another_table WHERE condition);
예제:
SELECT first_name, last_name FROM employees WHERE department_id IN (SELECT department_id FROM departments WHERE location_id = 1700);
이 예제에서는 location_id
가 1700인 부서에 속한 직원들을 조회합니다.
서브쿼리는 복잡한 쿼리를 단순화하고, 중첩된 데이터 집합을 처리하는 데 매우 유용한 도구입니다. 스칼라 서브쿼리, 인라인 뷰, EXISTS 및 IN 서브쿼리를 적절히 활용하면 다양한 데이터 요구사항을 효과적으로 처리할 수 있습니다.