-
존재성 유무에 사용되는 쿼리
습관들여놓으면 WHERE IN 절 또는 JOIN + DISTINCT 조합 대신 사용할 수 있다.
꽤 쏠쏠하게 사용하는 재미가 있다.
1. 필터링이 목적이므로 WHERE 절이 무조건 있어야한다. 따라서 EXISTS (SELECT 1 FROM Table WHERE ~) 식으로 짜여진다.
2. WHERE 절에서 밖의 테이블과 EXISTS 문 안 테이블 간의 상관관계를 매핑시켜줘야한다.
[EXISTS (SELECT 1 FROM WHERE... )]
아래와 같은 형식으로 사용한다.
EXISTS ( SELECT 1 FROM WHERE... ) 형태로 서브쿼리를 감싸서 넣으면 된다.
WHERE EXISTS ( SELECT 1 FROM ~ WHERE ~ )EXISTS는 존재성 유무
즉, 데이터가 있냐 없냐만 따지기 때문에
칼럼명들을 SELECT해서 내보낼 필요가 없다.
그래서 관습적으로 가장 가벼운 값인 1 이나 *를 사용한다.
[EXISTS 구문의 상관관계]
EXISTS문의 가장 큰 특징은 상관관계 매핑이다.
IN 절 같은 경우에는 WHERE id IN (SELECT id FROM ...) 과 처럼
괄호 밖의 칼럼과 서브쿼리 안의 칼럼을 IN 구문으로 직접 매칭한다.
즉, 칼럼 간의 매칭을 서브쿼리 밖에서 하는 것이다!
하지만 EXISTS 문은 칼럼 간 매칭을 서브쿼리 안에서 진행한다.
따라서 서브쿼리의 WHERE 절 내에서 밖의 칼럼과 EXISTS에 사용되는 테이블 칼럼을 매칭해야한다.
SELECT * FROM Employees e WHERE EXISTS ( SELECT 1 FROM Teams t WHERE t.manager_id = e.employee_id );EXISTS 절 밖의 Employees 테이블과 EXISTS 절 안의 Teams 테이블 간의 상관관계를 명시한다.
[타 존재성 검사 쿼리와의 차이점]
사실 존재성 검사는
- WHERE IN 서브쿼리
- JOIN 후 SELECT DISTINCT
이렇게 2개의 구문으로도 할 수 있다.
하지만 EXISTS는 위 두 구문보다 성능적으로 좋다.
1. WHERE IN vs EXISTS
WHERE IN 절은 메인쿼리를 실행하기 전
우선 서브쿼리를 실행하여 결과집합을 메모리에 올려놓는다.
그 이후 메인쿼리를 실행하여 비교를 한다.
따라서 공간복잡도 측면에서 추가적인 메모리 소비가 존재한다.

하지만 EXISTS는 그냥 해당 테이블에 가서 존재성만 확인하고 존재유무만 반환한다.
즉, 서브쿼리에 대한 결과집합 같은 것을 애초에 만들지 않는 것이다.
즉, 행들을 직접 조회해서 존재성만 캐치하고 돌아오는 것이다.
따라서 해당 테이블의 인덱스만 잘 걸려있으면 인덱스 B-Tree 타고 조회해서 바로 존재성 유무만 확인하고 나오는 것이다.
2. JOIN + DISTINCT vs EXISTS

JOIN은 한 개의 테이블에 다른 테이블을 엮어 테이블을 뿔리는 작업이다.
따라서 JOIN 으로 인한 결과 집합이 메모리에 올라온다.
WHERE IN 실행할때와 비슷한 상황이 발생하는 것이다.
따라서 결과 집합 자체를 만들지 않는 EXISTS가 성능면에서 훨씬 공간복잡도랑 시간복잡도가 낮다.
https://school.programmers.co.kr/learn/courses/30/lessons/157340
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr