DataBase

[SQL]IN / NOT IN / EXISTS / NOT EXISTS 은 어떻게 쓰는걸까?

Hyo Kim 2020. 12. 2. 20:13
728x90
반응형

특정 컬럼만 혹은 특정 컬럼만 제외하고 보고 싶을 때엔 

IN / NOT IN / EXISTS / NOT EXISTS 이런 명령어를 사용하여 하곤 합니다.

 

위와 같은 명령어들은 하나의 테이블에서도 가능하고, 두 개의 테이블에서도 사용이 가능합니다.

 

하지만! 속도면에 있어서 두 개 이상의 테이블에서 사용할 경우 별로 좋지 않기에

JOIN을 통해서 해결하시는 방법을 추천드립니다.

 

---

 

1. 간단하게 생각했을 때에 개념잡기!

 

IN / EXISTS => 조건에 부합하는 결과를 찾습니다.

NOT IN / NOT EXISTS => 조건에 부합하는 결과를 제외시킵니다.

 

2. 그래도 둘의 차이점은?

 

IN : 서브쿼리를 먼저 검색 -> 결과 목록 형성 -> 쿼리에서 하나하나씩 리스트 요소에 부합하는지 찾기

EXISTS : 쿼리에서 하나씩 레코드 가져오기 -> 서브쿼리 실행 -> 서브쿼리에 일치하는지 확인

 

작동 방식이 두 개가 서로 다르기 때문에 성능 면에서 큰 차이가 발생할 수도 있습니다.

 

예제를 보면서 짚어 나아가겠습니다.

 

SELECT id.a, name.a
FROM user
WHERE NOT IN (SELECT id.b FROM board WHERE id.a = id.b)

user id 와 board id가 일치하지 않는 값만 조회합니다.

 

SELECT id.a, name.a
FROM user
WHERE NOT EXISTS (SELECT id.b FROM board WHERE id.a = id.b)

 

똑같이 user id 와 board id가 일치하지 않는 값만 조회합니다.

 

하지만 둘에 큰 차이점이 있습니다.

NOT IN 은 NULL 과의 비교 연산은 UNKNOWN 을 반환합니다.

그러므로 원하는 결과값이 안 나올 수도 있습니다.

NULL을 제외시키려면

SELECT id.a, name.a
FROM user
WHERE NOT IN (SELECT id.b FROM board WHERE id.a = id.b IS NOT NULL)

위와 같이 IS NOT NULL을 사용하면 됩니다.

 

반대로 EXISTS 는 NULL값도 포함시켜서 검색을 합니다.

728x90
반응형