
A 테이블
A 테이블 필드 정보
a_id = PKa_title = a 기기의 이름B 테이블
B 테이블 필드 정보
b_id = PKa_id = A 테이블에 대한 FKA는 기기 테이블이고, B는 해당 기기의 오류 로그를 기록한 테이블이다.
이 때 나는 A 테이블의 기기 중 B 테이블의 오류 로그에 없는 데이터의 수를 조회하고 싶다.
이 때 사용할 수 있는 SQL 문법이 EXISTS와 NOT EXISTS이다.
이 EXISTS와 NOT EXISTS에 대해서 먼저 알아보자.
EXISTS는 서브 쿼리에서 반환된 결과가 해당 테이블에 존재하는지 여부를 확인하는 조건 연산자이다.
EXSITS 연산자를 사용할 때 연산자는 메인 쿼리를 먼저 실행하고, 그 다음 EXISTS 쿼리가 실행된다.
즉 메인 쿼리를 먼저 실행을 하여서 ROW를 하나 가져오고, EXISTS 절의 서브 쿼리를 실행시켜서 해당 결과 값이 존재하는지를 판단한다.
이 때 서브 쿼리의 결과가 true인지 false인지 체크하기 위해서 EXISTS에서는 결과가 존재할 경우의 메인 쿼리의 결과를 출력한다.
SELECT COUNT(*)
FROM A a
WHERE EXISTS ( SELECT 1
from B
WHERE a.id = a_id);
위 코드를 보면서 조금 더 자세히 알아보자.
위의 과정을 위 코드에 맞춰서 더 상세하게 해설해보자.
이 때 조건에 해당하는 데이터의 존재 여부를 판단하고, 더 이상 서브쿼리는 실행되지 않기에 서브 쿼리의 SELECT 절은 중요하지 않다.
그래서 쿼리의 성능을 조금 향상 시키고자 서브 쿼리의 SELECT 절에 1을 넣었는데, 이는 해당 테이블의 행 갯수만큼 1로 된 행을 출력시키지만 서브 쿼리의 결과는 출력과 의미가 없기에 이렇게 하였다.
EXISTS를 요약하면, 메인 쿼리의 값이 서브 쿼리의 조건절에 해당한다면 true 값을 반환해준다.
SELECT COUNT(*)
FROM A a
WHERE NOT EXISTS ( SELECT 1
from B
WHERE a.id = a_id);
NOT EXISTS는 서브 쿼리의 조건절에 맞지 않는 메인 쿼리의 ROW들에 한해서 true 값을 반환해준다.
이 외 동작 방식은 EXISTS와 동일하기에 이만 설명을 마치고자 한다.