Data Analyst/SQL

SQL - SubQuery

hmm06 2024. 9. 9. 15:32

WHERE 절에 중첩된 SQL 서브쿼리 (IN 절 사용)

- 우선 서브쿼리란 다른 쿼리 안에 포함된 쿼리를 의미합니다. 이를 내부 쿼리 또는 중첩  쿼리라고도 합니다.

- 이러한 서브쿼리는 WHERE 절 안에 중첩되어 사용되며, 주로 특정 조건에 맞는 데이터를 선택할 수 있습니다.

- IN 절과 함께 사용하면, 내부 쿼리에서 반환된 값 중 하나라도 일치하는 경우 해당 데이터를 선택할 수 있습니다.

- 서브 쿼리는 하나의 값, 하나의 행, 하나의 열 또는 전체 테이블을 반환할 수 있습니다.

- 여러 서브쿼리를 종첩하여 사용할 수 있으며, SQL엔진은 가장 내부의 쿼리부터 차례대로 실행 합니다.

-- 매니저의 e.first_name, e.last_name알기 위해서 subquery로 dept_manager의 emp_no를 가져와서 
-- WHERE절과 IN절을 이용하여 e.emp_no와 같은 것만 추출하게 만듦.
SELECT 
    e.first_name, e.last_name
FROM
    employees e
WHERE
    e.emp_no IN (SELECT 
            dm.emp_no
        FROM
            dept_manager dm);

EXISTS 및 NOT EXISTS 절에 중첩된 SQL 서브쿼리

- EXISTS는 서브쿼리 내의 조건에 맞는 행이 존재하는지 여부를 확인하는 절입니다. 존재 여부에 따라 TRUE 또는 FALSE를 반환합니다.

- 서브쿼리가 행을 반환하면 TRUE, 반환하지 않으면 FALSE가 되며 이 값이 따라 외부 쿼리에서 해당 행이 선택되거나 선택되지 않습니다.

- NOT EXISTS는 EXISTS의 반대 개념으로, 서브쿼리 내에 조건에 맞는 행이 존재하지 않을 경우에 TRUE를 반환합니다.

- 이와 같은 서브쿼리는 데이터를 존재 여부에 따라 필터링할 때 유용합니다.

/*
만약 dept_manager의 emp_no와 employees의 emp_no가 같은 값이 있는 경우 True 반환되어 
검색하려는 값의 first_name, last_name이 출력되게 됩니다.
*/

SELECT 
    e.first_name, e.last_name
FROM
    employees e
WHERE
    EXISTS( SELECT 
            *
        FROM
            dept_manager dm
        WHERE
            dm.emp_no = e.emp_no)
ORDER BY emp_no;

SELECT 및 FROM 절에 중첩된 SQL 서브쿼리

- SQL을 이미 상당히 잘 다룰 수 있는 수준에 도달한 후 다루는 주제입니다.

- SELECT와 FROM절에서 서브쿼리를 사용하여 더 복잡한 쿼리를 작성하는 방법을 다룹니다.

- 서브쿼리를 사용하면 복잡한 SQL 쿼리를 쉽게 나눠서 이해할 수 있고, 더 효율적인 데이터 검색이 가능합니다.

- 이와 같은 서브쿼리는 코드의 가독성을 높이고, 쿼리를 구조화하는데 유용합니다.

/*
 (SQL 서브쿼리, SELECT와 FROM에 중첩). 
 즉, 직원 번호 110022를 매니저로 지정하여 직원 번호 10001에서 10020까지의 모든 직원에게 할당 
 그리고 직원 번호 110039를 매니저로 지정하여 직원 번호 10021에서 10040까지의 모든 직원에게 할당
*/
SELECT 
    A.*
FROM
    (SELECT 
        e.emp_no AS employee_ID,
            MIN(de.dept_no) AS department_code,
            (SELECT 
                    emp_no
                FROM
                    dept_manager
                WHERE
                    emp_no = 110022) AS manager_ID
    FROM
        employees e
    JOIN dept_emp de ON e.emp_no = de.emp_no
    WHERE
        e.emp_no < 10020
    GROUP BY e.emp_no
    ORDER BY e.emp_no) AS A 
UNION SELECT 
    B.*
FROM
    (SELECT 
        e.emp_no AS employee_ID,
            MIN(de.dept_no) AS department_code,
            (SELECT 
                    emp_no
                FROM
                    dept_manager
                WHERE
                    emp_no = 110039) AS manager_ID
    FROM
        employees e
    JOIN dept_emp de ON e.emp_no = de.emp_no
    WHERE
        e.emp_no > 10020
    GROUP BY e.emp_no
    ORDER BY e.emp_no
    LIMIT 20) AS B
;

 


결론

서브쿼리는 복잡한 데이터를 더 직관적으로 필터링하거나 조작할 수 있게 해주는 강력한 도구입니다. 특히 SELECT, FROM, WHERE 절에 중첩된 형태로 사용하면 복잡한 쿼리도 효율적으로 작성할 수 있습니다. SQL을 더 깊이 이해하려면 서브쿼리의 다양한 사용법을 익히는 것이 중요합니다.

728x90