Oracle Subqueries

서브쿼리의 개념과 활용 (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 서브쿼리를 적절히 활용하면 다양한 데이터 요구사항을 효과적으로 처리할 수 있습니다.

Leave a Reply

Your email address will not be published. Required fields are marked *