DB EXISTS & NOT EXISTS

Kevin·2024년 3월 21일

Database

목록 보기
11/15
post-thumbnail

서론

A 테이블

A 테이블 필드 정보

  • a_id = PK
  • a_title = a 기기의 이름

B 테이블

B 테이블 필드 정보

  • b_id = PK
  • a_id = A 테이블에 대한 FK

A는 기기 테이블이고, B는 해당 기기의 오류 로그를 기록한 테이블이다.

이 때 나는 A 테이블의 기기 중 B 테이블의 오류 로그에 없는 데이터의 수를 조회하고 싶다.

이 때 사용할 수 있는 SQL 문법이 EXISTSNOT EXISTS이다.

EXISTSNOT EXISTS에 대해서 먼저 알아보자.


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);		

위 코드를 보면서 조금 더 자세히 알아보자.

💡 메인 쿼리에 따라서 A 테이블에 있는 ROW들을 하나씩 가져오고, EXISTS 절의 서브 쿼리를 실행시켜서 가져온 ROW가 해당 서브 쿼리로 가져온 값이 동일하면 true를 반환한다.

위의 과정을 위 코드에 맞춰서 더 상세하게 해설해보자.

💡 메인 쿼리에 따라서 A 테이블에 있는 ROW들을 하나씩 가져오고, 해당 ROW의 id 값과 B 테이블의 ROW의 a_id 필드 값이 동일하면 true를 반환한다.

이 때 조건에 해당하는 데이터의 존재 여부를 판단하고, 더 이상 서브쿼리는 실행되지 않기에 서브 쿼리의 SELECT 절은 중요하지 않다.

그래서 쿼리의 성능을 조금 향상 시키고자 서브 쿼리의 SELECT 절에 1을 넣었는데, 이는 해당 테이블의 행 갯수만큼 1로 된 행을 출력시키지만 서브 쿼리의 결과는 출력과 의미가 없기에 이렇게 하였다.

EXISTS를 요약하면, 메인 쿼리의 값이 서브 쿼리의 조건절에 해당한다면 true 값을 반환해준다.


NOT EXISTS

SELECT COUNT(*)
FROM A a
WHERE NOT EXISTS ( SELECT 1
				   from B
				   WHERE a.id = a_id);		

NOT EXISTS는 서브 쿼리의 조건절에 맞지 않는 메인 쿼리의 ROW들에 한해서 true 값을 반환해준다.

이 외 동작 방식은 EXISTS와 동일하기에 이만 설명을 마치고자 한다.

profile
Hello, World! \n

0개의 댓글