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
이 두 값은 결과에 나타나지 않게 되는 건가요?
정확한 매커니즘이 궁금합니다
메인인 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) -> 출력
아닙니다. 서브쿼리는 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 를 만나면 스캔 종료 -> 출력