본문 바로가기
카테고리 없음

SQL 서브쿼리 활용: EXISTS, NOT EXISTS, IN, NOT IN, ANY, ALL

by moment-love 2025. 1. 30.

SQL 서브쿼리 활용: EXISTS, NOT EXISTS, IN, NOT IN, ANY, ALL

 

SQL에서 서브쿼리(Subquery)는 하나의 쿼리 안에서 다른 쿼리를 실행하는 방식으로,

데이터를 보다 정교하게 필터링하거나 특정 조건을 만족하는 값을 찾을 때 사용됩니다.

특히 EXISTS, NOT EXISTS, IN, NOT IN, ANY, ALL은 조건문과 함께 사용되어 특정 조건에 맞는 데이터를 효과적으로 조회할 수 있습니다.

이번 글에서는 각 키워드의 특징과 사용 방법을 살펴보겠습니다.

 


1. EXISTS: 서브쿼리 결과가 존재할 경우 TRUE 반환

 

EXISTS는 서브쿼리의 결과가 하나 이상 존재하면 TRUE를 반환하는 연산자입니다.

일반적으로 조건을 만족하는 데이터가 있는지 확인할 때 사용됩니다.

 

SELECT EmployeeName 
FROM Employees E 
WHERE EXISTS (
    SELECT 1 FROM Departments D 
    WHERE D.DepartmentID = E.DepartmentID
);

 

이 쿼리는 Employees 테이블에서 Departments 테이블에 존재하는 DepartmentID를 가진 직원들만 조회합니다.
EXISTS는 서브쿼리 결과가 하나라도 존재하면 TRUE를 반환하므로, 서브쿼리에서 SELECT 1처럼 불필요한 컬럼을 조회하는 것이 일반적입니다.


2. NOT EXISTS: 특정 조건을 만족하지 않는 데이터 조회

 

NOT EXISTS는 서브쿼리의 결과가 존재하지 않는 경우에만 TRUE를 반환하는 조건입니다.

즉, 특정 조건을 만족하는 데이터가 없을 때만 메인 쿼리가 실행됩니다.

예를 들어, 부서(Departments) 테이블에 등록되지 않은 직원(Employees) 정보를 조회할 때 사용할 수 있습니다.

 

SELECT EmployeeName 
FROM Employees E 
WHERE NOT EXISTS (
    SELECT 1 FROM Departments D 
    WHERE D.DepartmentID = E.DepartmentID
);

 

이 쿼리는 Employees 테이블에서 Departments 테이블에 존재하지 않는 DepartmentID를 가진 직원만 조회합니다.

즉, 부서가 배정되지 않은 직원들이 출력됩니다. NOT EXISTS는 서브쿼리가 존재하지 않을 때만 동작하므로, 데이터가 많을 경우 성능이 우수한 편입니다.

 


3. IN: 서브쿼리 결과에 포함된 값 조회

 

IN은 서브쿼리에서 반환된 값 중 하나라도 일치하는 데이터를 찾을 때 사용됩니다.

특정 컬럼이 서브쿼리의 결과 목록에 포함되는지 확인하는 방식으로 동작하며, 단일 컬럼의 값을 비교할 때 유용합니다.

 

SELECT EmployeeName 
FROM Employees 
WHERE DepartmentID IN (
    SELECT DepartmentID FROM Departments
);

 

이 쿼리는 Employees 테이블에서 DepartmentID가 Departments 테이블에 존재하는 직원들만 조회합니다.

IN은 = 연산자를 여러 번 사용하는 것과 같은 효과를 가지며, 비교 대상이 많을 경우 성능이 저하될 수 있으므로 주의해야 합니다.

 


4. NOT IN: 서브쿼리 결과에 포함되지 않은 값 조회

 

NOT IN은 IN의 반대 개념으로, 서브쿼리 결과에 포함되지 않은 데이터를 조회할 때 사용됩니다.

특정 값이 서브쿼리의 결과에 없는 경우만 조회하므로, NOT EXISTS와 유사한 역할을 합니다.

 
SELECT EmployeeName 
FROM Employees 
WHERE DepartmentID NOT IN (
    SELECT DepartmentID FROM Departments
);

 

이 쿼리는 Employees 테이블에서 Departments 테이블에 없는 DepartmentID를 가진 직원들만 조회합니다.

하지만 NOT IN을 사용할 때 NULL 값이 포함되면 결과가 제대로 반환되지 않을 수 있으므로 주의해야 합니다.

NULL 값을 고려해야 한다면 NOT EXISTS를 사용하는 것이 안전합니다.

 


5. ANY: 서브쿼리 결과 중 하나라도 조건을 만족

 

ANY는 서브쿼리에서 반환된 값 중 하나라도 조건을 만족하면 TRUE를 반환합니다.

즉, 비교 대상 중 하나 이상이 일치하는 경우를 찾을 때 사용됩니다.

 

SELECT EmployeeName 
FROM Employees 
WHERE Salary > ANY (
    SELECT Salary FROM Employees WHERE DepartmentID = 101
);

 

이 쿼리는 Employees 테이블에서 DepartmentID가 101인 직원들의 급여 중 하나보다 큰 급여를 가진 직원을 조회합니다.

ANY는 >, <, = 연산자와 함께 사용되며, 하나라도 조건을 만족하면 결과를 반환합니다.

 


6. ALL: 서브쿼리 결과를 모두 만족하는 경우 조회

 

ALL은 서브쿼리의 모든 결과에 대해 조건을 만족해야 TRUE를 반환합니다.

즉, 비교 대상의 모든 값과 비교한 결과가 참이 되는 경우에만 데이터를 반환합니다.

 

SELECT EmployeeName 
FROM Employees 
WHERE Salary > ALL (
    SELECT Salary FROM Employees WHERE DepartmentID = 101
);

 

 

이 쿼리는 Employees 테이블에서 DepartmentID가 101인 모든 직원보다 높은 급여를 가진 직원을 조회합니다.

ALL은 모든 비교 대상과 비교하여 참이 되는 경우에만 결과를 반환하므로, 특정 기준보다 더 크거나 작은 값을 찾을 때 유용합니다.

 

 


7. 서브쿼리 조건 비교 정리

 

연산자 설명반환 조건
EXISTS 서브쿼리 결과가 존재하면 TRUE 하나라도 존재하면 반환
NOT EXISTS 서브쿼리 결과가 없으면 TRUE 하나도 없을 때 반환
IN 서브쿼리 결과 중 하나라도 일치 목록 내 값 포함 시 반환
NOT IN 서브쿼리 결과에 포함되지 않음 목록 내 값이 없을 때 반환
ANY 서브쿼리 결과 중 하나라도 만족 최소 하나 이상 참이면 반환
ALL 서브쿼리 결과 모두 만족해야 반환 모든 값이 참이면 반환

 

 

이와 같은 서브쿼리 연산자들은 SQLD 자격증 시험에서도 자주 출제되는 내용이므로,

각 연산자의 차이점을 명확히 이해하고 실제 데이터로 연습하는 것이 중요합니다.

실제 SQL을 실행하며 서브쿼리 조건문을 직접 실습해 보세요!

 

반응형