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을 더 깊이 이해하려면 서브쿼리의 다양한 사용법을 익히는 것이 중요합니다.
'Data Analyst > SQL' 카테고리의 다른 글
SQL - Routine, Stored Procedure (0) | 2024.09.12 |
---|---|
SQL - SELF JOIN, VIEW (0) | 2024.09.10 |
SQL - 여러 테이블 JOIN, SQL JOIN 사용 시 유용한 팁, UNION, UNION ALL (0) | 2024.09.03 |
SQL - RIGHT JOIN, SQL 조인 구문: 새로운 방식과 오래된 방식, CROSS JOIN (0) | 2024.09.02 |
SQL - INNER JOIN, DUPLICATED, LEFT JOIN (0) | 2024.08.31 |