서브쿼리(Subquery) 활용법: EXISTS, IN, ANY, ALL
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에서 매우 강력한 기능이므로,
여러 가지 연산자와 함께 실습하며 익혀보세요! 🚀😊