SQL 데이터 조회와 필터링 : IN 연산자


IN 연산자

이 학습은 패스트캠퍼스의 올인원 패키지 : 모두를 위한 SQL/DB 강의를 듣고 복습하는 내용입니다.

img

IN 연산자 문법

특정 집합(컬럼 혹은 리스트)에서 특정 집합 혹은 리스트가 존재하는지 판단하는 연산자이다.

● IN 연산자

img

>> COULM_NAME이 가지고 있는 집합에서 VALUE1, VALUE2 등의 값이 존재하는지 확인 (or이다. VALUE1 혹은 VALUE2)

● IN 연산자(서브쿼리)

img

>> COLUMN NAME이 가지고 있는 집합에서 TABLE_NAME2 테이블의 COULMN_NAME2의 집합이 존재하는지 확인

IN 연산자 실습

● 기본 IN 연산자 실습

- 쿼리문

SELECT
       CUSTOMER_ID
     , RENTAL_ID
     , RETURN_DATE
  FROM RENTAL
 WHERE
       CUSTOMER_ID IN (1, 2)       
ORDER BY RETURN_DATE DESC;

- 실행 결과

img

>> CUSTOMER_ID가 1혹은2인 행을 출력하는데, 그 결과를 RETURN_DATE 컬럼 내림차순으로 출력한다.

● IN 연산자 실습 - OR을 사용해서 IN연산자 기능을 구현

- 쿼리문

SELECT
       CUSTOMER_ID
     , RENTAL_ID
     , RETURN_DATE
  FROM RENTAL
 WHERE
          CUSTOMER_ID = 1 
       OR CUSTOMER_ID = 2
ORDER BY RETURN_DATE DESC;

- 실행결과

img

>> 바로 위의 IN연산자를 사용했을 때와 같은 결과가 나온다.

>> IN 연산자의 기능을 OR로 나타낸 것 => CUSTOMER_ID가 1혹은2인 행을 출력하는데, 그 결과를 RETURN_DATE 컬럼 내림차순으로 출력한다.

## IN 연산자를 사용하는 것이 더 좋은 이유!

- 가독성

- optimizer(dmbs 최적화기, sql 최적화)의 특성상 IN 조건이 성능상 유리할 때가 많다.

NOT IN 연산자 실습

● 기본 NOT IN 연산자 실습

- 쿼리문

SELECT
       CUSTOMER_ID
     , RENTAL_ID
     , RETURN_DATE
  FROM RENTAL
 WHERE
       CUSTOMER_ID NOT IN (1, 2)       
ORDER BY RETURN_DATE DESC;

- 실행 결과

img

>> CUSTOMER_ID가 1 혹은 2아닌 행을 출력한다 == 1과 2를 제외한 모든 행을 출력하는데, 그 결과를 RETURN_DATE 컬럼 내림차순으로 출력

>> NULL이 가장 큰 값이기 때문에 NULL이 젤 위에 나오는 것

● AND를 사용해서 NOT IN 연산자 기능을 구현

- 쿼리문

SELECT
      CUSTOMER_ID
     , RENTAL_ID
     , RETURN_DATE
  FROM RENTAL
 WHERE
       CUSTOMER_ID != 1 
   AND CUSTOMER_ID != 2
ORDER BY RETURN_DATE DESC;

- 실행 결과

img

>> 위의 NOT IN을 사용했을 때와 결과가 같다.

>> NOT IN의 기능을 AND로 나타낸 것 => 1과 2를 제외한 모든 행을 출력하는데, 그 결과를 RETURN_DATE 컬럼 내림차순으로 출력

## 위의 IN과 같이 NOT IN을 사용하는 것이 가독성과 옵티마이저 측면에서 더 좋다!

● 서브 쿼리 이용하는 IN 연산자 실습

1) 서브 쿼리 작성하기

- 쿼리문

SELECT
             CUSTOMER_ID
FROM
             RENTAL
WHERE
    CAST (RETURN_DATE AS DATE) = '2005-05-27';

- 실행결과

img

>> RETURN_DATE를 DATE로 형변환하여 2005년 5월 27일인 CUSTOMER_ID를 출력한다.

2) 작성한 서브쿼리 넣기

- 쿼리문

SELECT
      FIRST_NAME
    , LAST_NAME
 FROM CUSTOMER
WHERE CUSTOMER_ID IN (
					    SELECT
					        CUSTOMER_ID
					    FROM
					        RENTAL
					    WHERE
					        CAST (RETURN_DATE AS DATE) = '2005-05-27' 
       				);

- 실행결과

img

>> 위에서 작성한 쿼리문을 서브쿼리로 넣어서 RETURN_DATE가 2005년 5월 27일인 CUSTOMER_ID의 FIRST_NAME, LAST_NAME을 출력한다.

## 서브 쿼리를 이용하는 이유

- CUSTOMER에 RETURN_DATE 데이터를 넣는다면 서브 쿼리가 없어도 가능하겠지만, 그렇게 하면 RENTAL과 CUSTOMER 테이블의 데이터가 중복이 된다.

이러한, 데이터 중복을 방지하기 위함이다!


© 2021. All rights reserved.

----------Powered by Hydejack----------

kyusang Hwang