IT 소스/MariaDB

[MariaDB] SQL 쿼리 - IN, NOT IN

한량이야기 2023. 1. 20. 08:37
반응형

안녕하세요. 경제적, 시간적 자유를 꿈꾸는 한량입니다.

예문 테이블을 가지고 INNOT IN의 사용법과 어떻게 동작하는지 알아보겠습니다.

CREATE TABLE class1 ( name VARCHAR(20), color VARCHAR(10) );
CREATE TABLE class2 ( name VARCHAR(20), score INT );

INSERT INTO class1 
VALUES 
('BILL', 'red'), ('KIM', 'green'), ('ROSE', 'yellow'), ('SALLY', 'pink'), ('AMY', 'blue'), ('NANCY', 'black');

INSERT INTO class2 
VALUES 
('BILL', 70), ('KIM', 50), ('ROSE', 70), ('SALLY', 60), ('AMY', 80), ('NANCY', 90);

1. IN (검색값, ...)

IN 안에 값이 포함되는 데이터를 반환합니다.

SELECT * 
  FROM class1 
  WHERE name IN ('BILL', 'AMY');

// 실행 결과
name|color|
----+-----+
BILL|red  |
AMY |blue |

// IN은 풀어서 쓴 쿼리
SELECT * 
  FROM class1 
  WHERE name = 'BILL' OR name = 'AMY';

테이블 'class1'의 'name' 칼럼의 값이 'BILL'과 'AMY'의 데이터를 반환했습니다. 

 

2. NOT IN (검색값, ...)

IN 안에 값이 포함되지 않는 데이터를 반환합니다.

SELECT * 
  FROM class1 
  WHERE name NOT IN ('BILL', 'AMY');

// 실행 결과
name |color |
-----+------+
KIM  |green |
ROSE |yellow|
SALLY|pink  |
NANCY|black |

// NOT IN을 풀어서 쓴 쿼리
SELECT * 
  FROM class1 
  WHERE name <> 'BILL' AND name <> 'AMY';

테이블 'class1'의 'name' 칼럼의 값이 'BILL'과 'AMY'가 아닌 데이터를 반환했습니다. 

 

위 풀어서 쓴 쿼리를 보면 'IN'과 'NOT IN'에 'OR'와 'AND' 조건절이 걸리게 된다는 차이가 있습니다.

많은 검색값이 필요한 문장에서는 'IN'이나 'NOT IN'을 사용하면 불필요한 조건절을 생략할 수 있습니다.

 

3. SUBQUERY IN (SELECT ...)

IN 문안에 서브쿼리 사용도 가능합니다. 

SELECT * 
  FROM class1 
  WHERE name IN (SELECT name 
                   FROM class2 
                   WHERE score > 70
                 );

// 실행 결과
name |color|
-----+-----+
AMY  |blue |
NANCY|black|

테이블 'class2'의 'score'가 70 이상인 사람만 검색하여 'class1'의 테이블의 데이터를 반환했습니다.

 

4. SUBQUERY NOT IN (SELECT ...)

NOT IN 문안에 서브쿼리 사용도 가능합니다.

SELECT * 
  FROM class1 
  WHERE name NOT IN (SELECT name 
                       FROM class2 
                       WHERE score > 70
                     );

// 실행결과
name |color |
-----+------+
BILL |red   |
KIM  |green |
ROSE |yellow|
SALLY|pink  |

테이블 'class2'의 'score'가 70 이상인 사람 중 'class1'의 테이블의 'name' 칼럼의 값이 아닌 데이터를 반환했습니다.

 

IN과 NOT IN 문 안에 서브쿼리를 사용할 시 꼭 주의하셔야 할 경우가 있습니다. 

서브 쿼리의 조회 값에 'NULL'이 있을 경우 데이터가 출력되지 않습니다.

서브쿼리의 조회 조건절에 꼭 'NULL'을 포함하지 않는 조건절을 포함시켜 주시는 것이 좋습니다.

SELECT * 
  FROM class1 
  WHERE name IN (SELECT name 
                    FROM class2 
                    WHERE score > 70 
                    AND name IS NOT NULL
                 );
반응형