[PostgreSQL] EXISTS 연산자 - 빠르게 특정 조건의 일치 여부 파악 (ft. NOT EXISTS)
PostgreSQL에서 제공하는 EXISTS 연산자에 대해 알아보자.
▷ 구문
EXISTS (subquery)
NOT EXISTS (subquery)
EXISTS 연산자는 영어 의미 그대로 해당 subquery에서 반환하는 값이 존재하는지의 여부를 판단해주는 역할을 한다.
즉, 특정 조건의 일치 여부에 대해 true/false를 반환하는 것이다.
이 EXISTS 연산자를 사용하는 이유는 성능이 좋기 때문이다.
예를 들어 보통 값이 하나라도 존재하는지를 확인하고자 한다면 아래와 같은 쿼리문을 사용하고는 했을것이다.
-- count(*) > 0 인지 체크
select count(*) from mine where name = 'record'
데이터가 적을때는 상관 없지만 만약 많은 데이터를 가진 테이블에서 count를 사용한다면 쿼리의 성능이 매우 떨어진다.
이때 EXISTS를 사용해주면 매우 좋은 이유가, EXISTS는 조회 되는 데이터가 여러개가 있다 하더라도 존재 여부를 판단하는 연산자 이기 때문에 해당 쿼리의 값이 하나라도 반환되면 바로 연산이 종료되어 성능상 매우 뛰어나다.
이제 어느정도 알아봤으니 구문을 보면 사용하는데 어렵지는 않겠지만 예제를 통해 좀 더 접해보자.
▷ 예제1) EXISTS 기본 사용법
SELECT it_name, mine_name
FROM mine m
WHERE EXISTS (
SELECT 1
FROM record r
WHERE r.t_id = m.t_id
AND r.read > 11 )
사용법은 구문처럼 매우 간단하다 EXISTS 연산자 안에 서브쿼리를 사용하여 조건을 입력하면 되는데, 이 때 값이 하나라도 존재하면 연산이 종료되는 것이다.
이때 굳이 SELECT 1 을 해주는 이유는 사실 무슨 값을 넣어주던 상관없기때문에 그냥 형식상 1을 넣어주는것이다.
▷ 예제2) NOT EXISTS 기본 사용법
SELECT it_name, mine_name
FROM mine m
WHERE NOT EXISTS (
SELECT 1
FROM record r
WHERE r.t_id = m.t_id
AND r.read < 11 )
EXISTS 연산자 앞에 NOT만 붙여준것으로 똑같이 작동하나 의미만 반대가 된다.
즉, 값이 존재하지 않을 경우 연산이 종료되는 것이다.
참고 : https://www.postgresql.org/docs/10/functions-subquery.html