exists 질문 드립니다. 0 4 1,605

by 김동훈 [2023.09.09 20:16:14]


exists의 설명을 보면

EXISTS(서브 쿼리)는 서브 쿼리의 결과가 "한 건이라도 존재하면" TRUE 없으면 FALSE를 리턴한다.

EXISTS는 서브 쿼리에 일치하는 결과가 한 건이라도 있으면 쿼리를 더 이상 수행하지 않는다.

이렇게 되어 있는데 빨간 부분이 이해가 안 가서 질문 드립니다.

 

hi

id no
a 1
a 2
b 1
b 2
b 3
c 1
c 2

 

hello

id2 no2
a 1
b 1
c 1
d 2
e 2

 

 

select id, no

from hi as a

where exists (select 1 from hello as b where a.no = b.no2)

 

이렇게 쿼리가 있을 때 no1와 no2에 1이 일치하면

hi 테이블에 id = a, no = 1이 일치하고 해당 결과값만 true이고 쿼리를 더 이상 수행하지 않아서

id = b, no = 1

id = c, no = 1

이 두 값은 결과에 나타나지 않게 되는 건가요?

정확한 매커니즘이 궁금합니다

by 마농 [2023.09.11 00:22:14]

메인인 a 의 각 행마다 b 에 데이터가 있는지를 체크합니다.
a 가 7 행이니 서브쿼리가 7번 수행됩니다.
7번의 수행 결과 각각의 참/거짓을 따져서 a 를 출력할지 말지를 정합니다.
a의 1행의 no 1 에 대해 b 에서 no2 가 1 인 것을 찾으면
b의 첫행이 1 이므로 조건을 만족합니다.
그러면 이미 참이 되었으므로 더이상 b 에서 1을 찾지 않습니다.
a 의 첫행은 출력됩니다.
1행 1 은 b 에 존재(O) -> 출력
2행 2 는 b 에 존재(O) -> 출력
3행 1 은 b 에 존재(O) -> 출력
4행 2 는 b 에 존재(O) -> 출력
5행 3 은 b 에 존재(X) -> 제외
6행 1 은 b 에 존재(O) -> 출력
7행 2 는 b 에 존재(O) -> 출력


by 초보맨 [2023.09.13 10:25:08]

아하 그러면

결과가 한 건이라도 있으면 쿼리를 더 이상 수행하지 않는다.

이 말은

현재 b의 서브쿼리가 7번 실행되지만 결과가 존재하면 7번 미만으로 실행될 수 있다 이렇게 이해하면 되겠네요

감사합니다!


by 마농 [2023.09.13 10:53:47]

아닙니다. 서브쿼리는 7번 수행됩니다.
각 서브쿼리 안에서 b 를 스캔하는 과정 중에
조건을 만족하는 자료를 만나면 스캔을 중단하고 다음 서브쿼리로 넘어갑니다.

1행 1 은 b 에 1 이 있는지 스캔 -> 1 을 만나면 스캔 종료 -> 출력
2행 2 는 b 에 2 가 있는지 스캔 -> 2 를 만나면 스캔 종료 -> 출력
3행 1 은 b 에 1 이 있는지 스캔 -> 1 을 만나면 스캔 종료 -> 출력
4행 2 는 b 에 2 가 있는지 스캔 -> 2 를 만나면 스캔 종료 -> 출력
5행 3 은 b 에 3 이 있는지 스캔 -> 3 을 만나지 못함 -> 제외
6행 1 은 b 에 1 이 있는지 스캔 -> 1 을 만나면 스캔 종료 -> 출력
7행 2 는 b 에 2 가 있는지 스캔 -> 2 를 만나면 스캔 종료 -> 출력


by 초보맨 [2023.09.14 11:03:04]

아하 넵 정확히 이해했습니다

쉽게 풀어서 설명해 주셔서 감사합니다!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입