특정 컬럼만 혹은 특정 컬럼만 제외하고 보고 싶을 때엔
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값도 포함시켜서 검색을 합니다.
'DataBase' 카테고리의 다른 글
[MySQL] Mac M1 에서 MySQL password 재설정 (2) | 2022.04.25 |
---|---|
[MS-SQL] IN 구문 사용 시 매개변수 2100개 초과 (0) | 2021.11.09 |
[PostgreSQL] CLOB타입과 TEXT타입 - JPA (0) | 2021.04.23 |
[PostgreSQL]COUNT 사용 시 주의 (0) | 2021.04.17 |
left outer join ? (0) | 2020.10.30 |