SQL 데이터 조회와 필터링 : IN 연산자
IN 연산자
이 학습은 패스트캠퍼스의 올인원 패키지 : 모두를 위한 SQL/DB 강의를 듣고 복습하는 내용입니다.
IN 연산자 문법
특정 집합(컬럼 혹은 리스트)에서 특정 집합 혹은 리스트가 존재하는지 판단하는 연산자이다.
● IN 연산자
>> COULM_NAME이 가지고 있는 집합에서 VALUE1, VALUE2 등의 값이 존재하는지 확인 (or이다. VALUE1 혹은 VALUE2)
● IN 연산자(서브쿼리)
>> 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;
- 실행 결과
>> 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;
- 실행결과
>> 바로 위의 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;
- 실행 결과
>> 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;
- 실행 결과
>> 위의 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';
- 실행결과
>> 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'
);
- 실행결과
>> 위에서 작성한 쿼리문을 서브쿼리로 넣어서 RETURN_DATE가 2005년 5월 27일인 CUSTOMER_ID의 FIRST_NAME, LAST_NAME을 출력한다.
## 서브 쿼리를 이용하는 이유
- CUSTOMER에 RETURN_DATE 데이터를 넣는다면 서브 쿼리가 없어도 가능하겠지만, 그렇게 하면 RENTAL과 CUSTOMER 테이블의 데이터가 중복이 된다.
이러한, 데이터 중복을 방지하기 위함이다!