MSSQL IN과 NOT IN 연산자 사용법, 여러 조건을 한 번에 필터링하는 방법
📌 IN, NOT IN으로 특정 값 목록을 손쉽게 비교하고 데이터 조회 효율 높이기
데이터베이스에서 조건을 설정할 때 여러 개의 값을 동시에 비교해야 하는 경우가 많습니다.
이때 IN과 NOT IN 연산자를 사용하면 간단하고 가독성 높은 SQL 문을 작성할 수 있습니다.
예를 들어, 고객 테이블에서 이름이 ‘A’, ‘B’, ‘C’ 중 하나인 데이터를 찾으려면 WHERE name IN ('A', 'B', 'C')처럼 작성하면 됩니다.
반대로 특정 목록에 없는 데이터만 조회하려면 NOT IN을 사용합니다.
이번 글에서는 IN과 NOT IN의 기본 개념, 사용법, 실무 예제, 성능 관련 주의사항까지 모두 살펴봅니다.
특히 WHERE 절에서 다중 조건을 깔끔하게 처리하고 싶은 분들에게 유용한 내용이 될 것입니다.
📋 목차
🔗 IN 연산자의 기본 개념
MSSQL에서 IN 연산자는 특정 컬럼 값이 지정된 값 목록 중 하나와 일치하는지를 확인하는 조건식입니다.
즉, 다중 OR 조건을 간단하게 표현할 수 있도록 도와줍니다.
예를 들어, 고객 이름이 ‘A’, ‘B’, ‘C’ 중 하나인 경우를 찾고자 할 때, OR 조건을 반복해서 쓰는 대신 IN 연산자로 짧고 가독성 있게 작성할 수 있습니다.
다음 두 쿼리는 동일한 결과를 반환하지만, 첫 번째 예시처럼 IN을 사용하면 훨씬 간결합니다.
-- IN 사용
SELECT *
FROM Customers
WHERE Name IN ('A', 'B', 'C');
-- OR 조건 반복
SELECT *
FROM Customers
WHERE Name = 'A'
OR Name = 'B'
OR Name = 'C';
💬 IN은 다중 OR 조건을 간결하게 작성할 수 있는 강력한 문법입니다.
또한 IN 연산자는 서브쿼리와 결합해 동적으로 목록을 생성할 수도 있습니다.
예를 들어, 특정 지역에 속한 고객의 주문 내역을 가져오고 싶다면, 고객 ID를 반환하는 서브쿼리를 IN 조건에 포함시키면 됩니다.
🛠️ IN 연산자 기본 문법
IN 연산자의 문법은 간단합니다.
WHERE 절에서 비교할 컬럼을 지정하고, 뒤에 IN 키워드와 소괄호로 묶인 값 목록을 나열하면 됩니다.
값 목록은 직접 입력할 수도 있고, 서브쿼리 결과를 사용할 수도 있습니다.
-- 기본 문법
SELECT 컬럼명
FROM 테이블명
WHERE 컬럼명 IN (값1, 값2, 값3, ...);
-- 서브쿼리 사용
SELECT OrderID, CustomerID
FROM Orders
WHERE CustomerID IN (
SELECT CustomerID
FROM Customers
WHERE Country = 'Korea'
);
💡 TIP: 값 목록에 문자열을 사용할 경우 반드시 작은따옴표(‘)로 감싸야 하며, 숫자는 따옴표 없이 바로 작성합니다.
IN은 가독성이 좋아 코드 유지보수에 유리하지만, 값의 개수가 많아지면 성능 저하가 발생할 수 있으므로 필요에 따라 임시 테이블이나 JOIN을 고려하는 것이 좋습니다.
⚙️ NOT IN 사용 시 주의사항
IN 연산자와 반대로, NOT IN은 값 목록에 포함되지 않은 행만 조회합니다.
특정 값들을 제외하고 데이터를 필터링할 때 유용하지만, 사용 시 주의할 점이 있습니다.
📌 NULL 값 주의
NOT IN의 값 목록이나 서브쿼리 결과에 NULL이 포함되면, 해당 조건은 항상 FALSE가 되어 결과가 나오지 않는 문제가 발생할 수 있습니다.
이러한 경우, NULL을 제거하거나 NOT EXISTS로 대체하는 것이 안전합니다.
-- NOT IN 사용 시 NULL 주의
SELECT *
FROM Customers
WHERE Country NOT IN ('Korea', 'Japan');
-- 안전하게 처리하려면
SELECT *
FROM Customers
WHERE Country NOT IN ('Korea', 'Japan')
AND Country IS NOT NULL;
⚠️ 주의: NULL 값이 포함된 컬럼에 대해 NOT IN을 그대로 사용하면 의도치 않게 결과가 비어 있을 수 있습니다.
실무에서는 데이터 정제 과정에서 NULL 처리 여부를 항상 확인하고, 필요한 경우 조건절을 보완하는 습관이 중요합니다.
🔌 IN과 JOIN, EXISTS 비교
MSSQL에서 IN은 편리하지만, 모든 상황에서 최선의 선택은 아닙니다.
특히 서브쿼리를 사용할 때는 JOIN이나 EXISTS와 비교하여 성능과 가독성을 판단해야 합니다.
📌 IN vs JOIN
JOIN은 두 테이블을 연결해 필요한 데이터를 가져오는 방법입니다.
서브쿼리를 IN 조건에 넣는 대신 JOIN을 사용하면, 필요한 컬럼을 동시에 가져올 수 있어 효율적일 때가 많습니다.
-- IN 사용
SELECT *
FROM Orders
WHERE CustomerID IN (
SELECT CustomerID
FROM Customers
WHERE Country = 'Korea'
);
-- JOIN 사용
SELECT o.*
FROM Orders o
JOIN Customers c
ON o.CustomerID = c.CustomerID
WHERE c.Country = 'Korea';
📌 IN vs EXISTS
EXISTS는 조건에 맞는 행이 존재하는지만 확인하기 때문에, 실제 데이터 조회량이 많지 않은 경우 성능이 더 좋을 수 있습니다.
특히 서브쿼리에서 대량의 데이터를 반환하는 상황에서는 EXISTS가 유리합니다.
-- EXISTS 사용
SELECT *
FROM Orders o
WHERE EXISTS (
SELECT 1
FROM Customers c
WHERE c.CustomerID = o.CustomerID
AND c.Country = 'Korea'
);
💡 TIP: 데이터 양과 인덱스 구조에 따라 IN, JOIN, EXISTS 중 가장 효율적인 방법을 선택하는 것이 중요합니다.
💡 IN, NOT IN 성능 최적화 팁
IN과 NOT IN은 간결하고 가독성이 좋지만, 잘못 사용하면 성능 저하를 유발할 수 있습니다.
특히 값 목록이 많거나 서브쿼리가 대량의 데이터를 반환하는 경우 주의해야 합니다.
📌 성능 최적화 전략
- ⚡서브쿼리 결과에 인덱스를 적용하여 검색 속도 향상
- 📊값 목록이 많은 경우 임시 테이블로 변환 후 JOIN 사용 고려
- 🛠️NOT IN 사용 시 NULL 값 필터링 필수
- 🔍필요에 따라 EXISTS 또는 JOIN으로 대체
아래 예시는 IN 조건을 JOIN으로 변환하여 성능을 개선한 사례입니다.
-- IN 사용
SELECT *
FROM Orders
WHERE CustomerID IN (
SELECT CustomerID
FROM Customers
WHERE Country = 'Korea'
);
-- JOIN 사용 (성능 개선)
SELECT o.*
FROM Orders o
JOIN Customers c
ON o.CustomerID = c.CustomerID
WHERE c.Country = 'Korea';
⚠️ 주의: 값이 수천 개 이상인 IN 조건은 성능 저하를 유발할 수 있으므로, 반드시 인덱스 구조와 실행 계획을 확인하세요.
❓ 자주 묻는 질문 (FAQ)
IN과 OR 조건은 완전히 동일한가요?
NOT IN을 사용할 때 결과가 비어 있는 이유는 무엇인가요?
IN 조건에 값이 많으면 성능이 떨어지나요?
IN 대신 EXISTS를 써야 하는 경우는 언제인가요?
숫자 컬럼에도 IN을 사용할 수 있나요?
IN 조건 안에서 중복된 값이 있으면 어떻게 되나요?
IN과 LIKE를 함께 사용할 수 있나요?
IN 조건의 값 목록에 변수를 사용할 수 있나요?
📌 IN, NOT IN 연산자로 SQL 조건을 더 깔끔하게 관리하기
IN과 NOT IN 연산자는 SQL에서 다중 조건을 처리할 때 매우 강력한 도구입니다.
특히 여러 개의 OR 조건을 간결하게 표현하거나 특정 값들을 제외한 데이터를 조회할 때 효율적입니다.
이번 글에서는 두 연산자의 개념부터 문법, 사용 시 주의사항, 성능 최적화 방법까지 살펴봤습니다.
핵심은 데이터의 특성과 조건에 맞춰 가장 효율적인 방법을 선택하는 것입니다.
서브쿼리 결과나 값 목록이 크다면 JOIN이나 EXISTS로 대체를 고려하고, NOT IN 사용 시 NULL 값 처리에 유의해야 합니다.
이러한 기본기를 지키면 SQL 쿼리의 가독성과 성능을 동시에 향상시킬 수 있습니다.
🏷️ 관련 태그 : MSSQL, IN, NOT IN, SQL조건문, 데이터조회, SELECT문, 서브쿼리, EXISTS, JOIN, SQL최적화