개발/SQL

서브쿼리(Subquery) 활용법: EXISTS, IN, ANY, ALL

예니03 2025. 3. 17. 10:39
반응형

SQL에서 서브쿼리(Subquery)란, 다른 쿼리 안에서 사용되는 쿼리를 의미합니다.
서브쿼리는 일반적으로 메인 쿼리의 WHERE 절이나 SELECT 절에서 사용되며,
특정 조건을 만족하는 데이터를 찾거나, 다른 테이블과 비교하는 데 유용하게 활용됩니다.

이번 글에서는 서브쿼리의 기본 개념과 EXISTS, IN, ANY, ALL 연산자의 차이점을
초보자도 쉽게 이해할 수 있도록 설명해드리겠습니다! 😊


🔹 1. 서브쿼리란?

📌 서브쿼리(Subquery)란 하나의 SQL 문 안에 포함된 또 다른 SQL 문입니다.
즉, 메인 쿼리(Main Query)의 일부로 사용되는 쿼리라고 생각하면 됩니다.

서브쿼리 기본 문법

SELECT 컬럼명
FROM 테이블명
WHERE 컬럼명 (연산자) (서브쿼리);

✔ 서브쿼리는 괄호 () 안에 작성됩니다.
연산자(IN, EXISTS, ANY, ALL 등)를 사용하여 메인 쿼리와 연결됩니다.


🔹 2. 서브쿼리 예제 (기본 개념 이해하기)

문제: 부서 테이블에서 직원이 존재하는 부서만 조회하기

우리가 사용할 테이블은 직원 정보(employees)와 부서 정보(departments)입니다.

🔸 employees (직원 테이블)

emp_id name dept_id
1 Alice 101
2 Bob 102
3 Charlie NULL

🔸 departments (부서 테이블)

dept_id dept_name
101 IT
102 HR
103 Marketing

📌 직원이 존재하는 부서만 조회하려면?

SELECT dept_name
FROM departments
WHERE dept_id IN (SELECT DISTINCT dept_id FROM employees WHERE dept_id IS NOT NULL);

✔ 서브쿼리 (SELECT DISTINCT dept_id FROM employees WHERE dept_id IS NOT NULL)
➡ 직원 테이블에서 중복을 제거한 부서 ID 목록을 가져옴
✔ 메인 쿼리에서 부서 ID가 이 목록에 포함된 경우만 조회

🔸 결과 (직원이 있는 부서만 출력됨)

dept_name
IT
HR

🔹 3. EXISTS – 서브쿼리 결과가 존재하는지 확인

📌 EXISTS는 서브쿼리의 결과가 존재하는지 여부를 확인하여 TRUE 또는 FALSE를 반환합니다.

EXISTS 활용 예제 (직원이 존재하는 부서만 조회)

SELECT dept_name
FROM departments d
WHERE EXISTS (
    SELECT 1
    FROM employees e
    WHERE e.dept_id = d.dept_id
);

✔ SELECT 1은 서브쿼리에서 존재 여부만 확인하기 때문에 1을 반환
✔ EXISTS는 값이 무엇인지가 아니라 "존재하는지 여부"만 체크
✔ 직원이 있는 부서만 조회됨

📌 EXISTS vs. IN 차이점
✔ EXISTS는 서브쿼리의 결과가 하나라도 존재하면 TRUE
✔ IN은 서브쿼리에서 특정 값 목록을 반환하여 비교


🔹 4. IN – 서브쿼리 결과값과 일치하는 데이터 찾기

📌 IN 연산자는 서브쿼리에서 반환된 값 중 하나라도 일치하면 TRUE가 됩니다.

IN 활용 예제 (직원이 있는 부서만 조회)

SELECT dept_name
FROM departments
WHERE dept_id IN (SELECT DISTINCT dept_id FROM employees WHERE dept_id IS NOT NULL);

employees 테이블에서 dept_id를 가져와서 비교
부서 ID가 일치하는 경우에만 결과를 반환

📌 EXISTS vs. IN 비교
✔ IN은 서브쿼리 결과값과 직접 비교
✔ EXISTS는 값이 존재하는지만 체크하여 더 빠름 (특히, 데이터가 많은 경우)


🔹 5. ANY – 서브쿼리 결과 중 하나라도 만족하면 TRUE

📌 ANY 연산자는 서브쿼리에서 반환된 값 중 하나라도 조건을 만족하면 TRUE를 반환합니다.
보통 > ANY, < ANY 같은 형태로 사용됩니다.

ANY 활용 예제 (직원 중 가장 낮은 급여보다 높은 급여 찾기)

SELECT name, salary
FROM employees
WHERE salary > ANY (SELECT salary FROM employees WHERE dept_id = 101);

✔ ANY (SELECT salary FROM employees WHERE dept_id = 101)
➡ dept_id = 101인 직원들의 급여 목록 중 하나라도 초과하면 결과 반환

📌 ANY vs. IN 차이점
✔ IN은 정확히 일치하는 값만 체크
✔ ANY는 조건을 만족하는 값이 하나라도 있으면 TRUE


🔹 6. ALL – 서브쿼리 결과의 모든 값과 비교

📌 ALL 연산자는 서브쿼리에서 반환된 모든 값과 비교하여 조건을 만족해야 TRUE입니다.

ALL 활용 예제 (모든 IT 부서 직원보다 높은 급여 찾기)

SELECT name, salary
FROM employees
WHERE salary > ALL (SELECT salary FROM employees WHERE dept_id = 101);

✔ ALL을 사용하면 모든 비교 대상보다 커야 조건 만족
가장 높은 급여보다도 커야 TRUE 반환

📌 ANY vs. ALL 비교
✔ ANY는 하나라도 만족하면 TRUE
✔ ALL은 모든 값과 비교해서 모두 만족해야 TRUE


🔹 7. 서브쿼리 활용법 요약 정리

연산자 설명 사용 예제
EXISTS 서브쿼리 결과가 하나라도 있으면 TRUE WHERE EXISTS (서브쿼리)
IN 서브쿼리 결과 중 하나라도 일치하면 TRUE WHERE 컬럼 IN (서브쿼리)
ANY 서브쿼리 결과 중 하나라도 조건을 만족하면 TRUE WHERE 컬럼 > ANY (서브쿼리)
ALL 서브쿼리 결과의 모든 값과 비교하여 조건 만족 시 TRUE WHERE 컬럼 > ALL (서브쿼리)

🔹 마무리 & 실전 연습

✔ EXISTS는 서브쿼리 결과가 존재하는지 확인할 때 사용
✔ IN은 서브쿼리에서 반환된 값과 비교할 때 사용
✔ ANY는 서브쿼리 값 중 하나라도 조건 만족하면 TRUE
✔ ALL은 서브쿼리 값 전체를 만족해야 TRUE

서브쿼리는 SQL에서 매우 강력한 기능이므로,
여러 가지 연산자와 함께 실습하며 익혀보세요! 🚀😊

 

반응형