SQL In
SQL IN: 다중 값과 조건 비교
SQL IN 연산자는 WHERE 절에서 사용되며, 특정 열의 값이 지정된 여러 값 중 하나와 일치하는지 확인할 때 사용됩니다. 여러 개의 값을 한 번에 비교할 수 있어, 여러 OR 조건을 사용하는 것보다 간결하고 효율적입니다. IN 연산자는 데이터베이스 쿼리에서 특정 값 목록이나 서브쿼리 결과와 비교하여 데이터를 필터링할 때 매우 유용합니다.
1. 기본 IN 문법
IN 연산자의 기본 문법은 다음과 같습니다:
SELECT 열이름
FROM 테이블이름
WHERE 열이름 IN (값1, 값2, ...);
- 열이름: 비교할 열의 이름.
- 값1, 값2, ...: 비교할 여러 값 목록.
2. SQL IN 예제
2.1 값 목록에 있는 데이터 찾기
다음은 employees
테이블에서 부서가 Sales
, HR
, Marketing
중 하나에 속한 직원을 검색하는
예제입니다.
SELECT name, department
FROM employees
WHERE department IN ('Sales', 'HR', 'Marketing');
이 쿼리는 부서가 Sales, HR, 또는 Marketing인 직원을 모두 반환합니다.
결과 예시:
name | department |
---|---|
John | Sales |
Jane | HR |
Alice | Marketing |
3. NOT IN: 값 목록에 없는 데이터 찾기
NOT IN 연산자는 IN의 반대 역할을 하며, 특정 값 목록에 없는 데이터를 검색합니다.
예제: 특정 부서에 속하지 않은 직원 찾기
SELECT name, department
FROM employees
WHERE department NOT IN ('Sales', 'HR');
이 쿼리는 부서가 Sales 또는 HR가 아닌 직원을 반환합니다.
결과 예시:
name | department |
---|---|
Alice | Engineering |
Bob | Marketing |
4. IN과 숫자 데이터
IN 연산자는 문자열뿐만 아니라 숫자 데이터와도 사용할 수 있습니다.
예제: 특정 급여를 받는 직원 찾기
SELECT name, salary
FROM employees
WHERE salary IN (3000, 5000, 7000);
이 쿼리는 급여가 3,000, 5,000 또는 7,000인 직원을 반환합니다.
결과 예시:
name | salary |
---|---|
John | 5000 |
Jane | 7000 |
5. IN과 서브쿼리 사용
IN 연산자는 고정된 값 목록뿐만 아니라 서브쿼리와 결합하여 특정 쿼리 결과와 비교할 수 있습니다. 이를 통해 동적으로 데이터를 필터링할 수 있습니다.
예제: 특정 부서에 속한 직원 찾기 (서브쿼리 사용)
다음은 departments
테이블에서 Sales
와 HR
부서의 id
를 조회한 후, 그 부서에 속한 직원을 찾는
예제입니다.
SELECT name, department_id
FROM employees
WHERE department_id IN (SELECT id FROM departments WHERE name IN ('Sales', 'HR'));
이 쿼리는 Sales와 HR 부서에 속한 직원을 조회합니다.
결과 예시:
name | department_id |
---|---|
John | 1 |
Jane | 2 |
6. IN과 JOIN 대신 사용
IN 연산자는 간단한 값 목록 비교에 유용하지만, 데이터베이스의 성능을 고려할 때 복잡한 쿼리에서는 JOIN을 사용하는 것이 더 효율적일 수 있습니다. 그러나 값의 개수가 적거나 간단한 서브쿼리에서는 IN이 간편하게 사용할 수 있습니다.
예제: JOIN과 IN을 함께 사용하는 방법
SELECT e.name, d.name AS department
FROM employees e
JOIN departments d ON e.department_id = d.id
WHERE d.name IN ('Sales', 'HR');
이 쿼리는 Sales와 HR 부서에 속한 직원들을 JOIN을 통해 조회합니다.
7. IN과 대소문자 구분
대부분의 SQL 데이터베이스에서 IN 연산자는 대소문자를 구분하지 않습니다(대부분의 SQL 구현에서). 이는 LIKE 연산자와 유사하게, 문자열 비교 시 대소문자 구분 없이 동작합니다.
예제: 대소문자 구분 없이 'Sales'와 'HR' 검색
SELECT name, department
FROM employees
WHERE department IN ('sales', 'HR');
이 쿼리는 Sales와 HR 부서를 구분하지 않고 검색합니다.
8. IN과 NULL 값 처리
IN 연산자는 NULL 값을 비교할 때 다르게 동작합니다. NULL은 어떤 값과도 같지 않기 때문에, IN 목록에 NULL이 있을 경우 NULL은 무시됩니다.
예제: NULL 값과의 비교
SELECT name
FROM employees
WHERE department IN ('Sales', NULL);
이 쿼리는 NULL 값과 일치하는 데이터를 반환하지 않습니다. NULL 값을 처리하려면 다음과 같이 IS NULL을 사용해야 합니다.
예제: NULL 값 포함하여 검색
SELECT name
FROM employees
WHERE department IN ('Sales') OR department IS NULL;
이 쿼리는 Sales 부서에 속하거나 NULL 값을 가진 직원을 반환합니다.
9. 실전 예제
예제 1: 특정 급여를 받는 직원 조회
SELECT name, salary
FROM employees
WHERE salary IN (3000, 5000, 7000);
이 쿼리는 급여가 3,000, 5,000, 7,000인 직원을 반환합니다.
예제 2: 특정 부서에 속하지 않은 직원 조회
SELECT name, department
FROM employees
WHERE department NOT IN ('Sales', 'HR');
이 쿼리는 Sales와 HR 부서에 속하지 않은 직원을 반환합니다.
예제 3: 서브쿼리를 사용하여 부서의 직원 조회
SELECT name
FROM employees
WHERE department_id IN (SELECT id FROM departments WHERE name IN ('Sales', 'HR'));
이 쿼리는 Sales와 HR 부서의 직원을 반환합니다.
10. 요약
SQL IN 연산자는 특정 값 목록이나 서브쿼리 결과와 데이터를 비교하는 강력한 도구입니다. IN은 여러 OR 조건을 결합하는 것보다 간결하고 효율적이며, 특히 값 목록이나 서브쿼리 결과와 비교할 때 유용합니다. NOT IN을 사용하면 목록에 없는 값을 쉽게 필터링할 수 있으며, NULL 값은 특별한 처리 없이 무시됩니다. IN 연산자는 간단한 비교뿐만 아니라, 서브쿼리와 결합하여 복잡한 조건을 효율적으로 처리할 수 있습니다.