코딩 스쿨 SQL

언어선택 : HTMLCSSJAVAJAVASCRIPTMYSQLSQL PHP

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 테이블에서 SalesHR 부서의 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');

이 쿼리는 SalesHR 부서를 구분하지 않고 검색합니다.

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 연산자는 간단한 비교뿐만 아니라, 서브쿼리와 결합하여 복잡한 조건을 효율적으로 처리할 수 있습니다.


copyright ⓒ 스타트코딩 all rights reserved.
이메일 : startcodingim@gamil.com