EXIST랑 IN은 사실상 똑같이 동작함.


EXIST IN은 둘다 semi join으로 작동하는데 사실 논리적으로 동치는 아님. right에 null이 들어가 있으면 exist는 false고 in은 null임

하지만 semi join에서 null은 무시되는값이라서 실제로는 semi-join으로 똑같이 치환해서 플랜을 생성한다


단, not in이랑 not exists는 똑같이 동작하지도 않고 논리적으로도 동치도 아니고 심지어 결과값도 차이가 있음


not in은 na anti-semi join이고 not exists는 anti-semi join으로 플랜이 생성됨.

NA(Null-Aware) anti-semi join은 잘은 모르지만 내부구조상 좆같이 느리므로 사용하는데 문제가 많음.


일반적으로 in ( subquery )를 쓰다가 not붙이면 결과값 반대 아님? 하면서 not을 붙이는데 in 결과값을 반대로 보려면 not exist가 맞다.

성능도 이쪽이 훨씬빠르다.