336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
오라클의 EXISTS와 IN함수는 의미는 거의 비슷하지만 조금의 차이를 가진다.
(NOT은 각 함수의 반대의 의미를 가진다)
간단하게 보면, 둘다 존재하느냐 포함하느냐 머 비슷하다.
하지만 사용 방식의 차이와 NULL 값을 포함하냐 마느냐 차이가 있다.
그리고 EXISTS는 서브쿼리만을 사용이 가능하고, IN은 서브쿼리뿐만 아니라 단순 값도 사용이 가능하다.
이런 설명보단 예시로 보는게 가장 이해하기 좋은 것 같으니 예시를 봐보자.
(가로로 배치했었는데... 반응형때문에.. 뭉개져서.. 보시기 불편하겠지만.. 세로로 했습니다.ㅠ,ㅠ)
<TEST_IN_AND_EXISTS >

<TEST_IN_AND_EXISTS2>
우선 두 테이블에 위와 같이 데이터를 넣어놨다.
저같은경우에는 IN만 알고 있었는데, EXISTS라는 것을 알게되 비교 포스팅을 하게 되었습니다.
처음에는.. EXISTS가 잘 이해 안됬었는데.. 현재도 완전 디테일하게는 이해를 못했지만.. 이렇게 생각하자라고 결론을 냈습니다.
먼저 EXISTS 쿼리 부터 보면,
SELECT A.B_COLUMN, A.A_COLUMN FROM TEST_IN_AND_EXISTS A WHERE EXISTS (SELECT B.A_COLUMN FROM TEST_IN_AND_EXISTS2 B WHERE B.A_COLUMN = A.B_COLUMN); |
제가 이해가 잘 안된부분은 서브쿼리였는데..
(사실.. 저 서브쿼리가 멀 나타내주는지를 정확히는 이해를 못한 상태입니다..)
단순하게 생각하면 두테이블을 비교하는데 조건을 A 테이블의 B_COLUMN과 B 테이블의 A_COLUMN을 기준이라고 보면 된다..
(TEST_IN_AND_EXISTS의 Alias를 A 2를 B로 했기에 A 테이블과 B 테이블로 부르겠습니다..)
좀 더 쉽게 말하면 B 테이블의 A_COLUMN의 값이 A 테이블의 B_COLUMN에 존재하는 데이터를 불러와줘 라고 보면 된다..
말로만 하지말고 결과를 보면,

위와 같은 결과를 볼 수 있는데,
예시를 다시 말로 풀어보면, B테이블의 A_COLUMN의 값은 1,2,3,4,5,6,7 이 있다. 이 값이 존재하는 A테이블의 B_COLUMN의 값중에 존재하는 값들만 보여줘라는 쿼리구문이다. 그래서 A테이블의 B_COLUMN이 1,2,3인 것은 보여주고 9와 null 값은 포함하지 않기에 보여주지 않는 것이다.
이상태에서 IN 쿼리를 비교해 보면,
SELECT A.B_COLUMN, A.A_COLUMN FROM TEST_IN_AND_EXISTS A WHERE A.B_COLUMN IN (SELECT B.A_COLUMN FROM TEST_IN_AND_EXISTS2 B); |
같은 의미를 지닐수 있도록 IN함수로 쿼리를 표현해봤습니다.
EXISTS와 달리 IN함수 같은경우에는 비교할 컬럼을 앞에 넣어 줍니다.
(그래서 처음에 EXISTS는 머랑 비교 하는거지 라는 것에 고민을 많이 햇었습니다...)
위 쿼리를 말로 해보면 A테이블의 A.B_COLUMN 값 중에 B테이블의 B.A_COLUMN들이 포함한 데이터를 불러와줘 이다..
결과를 보면,

EXISTS와 별차이가 없는 것을 볼 수 있다.
근데 왜 EXISTS와 IN을 비교해놨어라고 할 수 있지만, NOT이 포함한 함수에서 위에서도 잠깐 언급한 차이를 볼 수 있다.
NOT EXISTS 쿼리로 보면,
SELECT A.B_COLUMN, A.A_COLUMN FROM TEST_IN_AND_EXISTS A WHERE NOT EXISTS (SELECT B.A_COLUMN FROM TEST_IN_AND_EXISTS2 B WHERE B.A_COLUMN = A.B_COLUMN); |
EXISTS쿼리 의미에서 NOT 이 붙음으로써 딱 반대되는 의미이다.
그렇기에 바로 결과를 보면,

말그대로 딱 정반대의 A테이블의 나머지 3개의 데이터를 가진 결과가 나온다. NULL값을 포함한..
그다음 NOT IN 쿼리를 보면,
SELECT A.B_COLUMN, A.A_COLUMN FROM TEST_IN_AND_EXISTS A WHERE A.B_COLUMN NOT IN (SELECT B.A_COLUMN FROM TEST_IN_AND_EXISTS2 B); |
IN쿼리 의미에서 NOT 이 붙음으로써 딱 반대되는 의미이다.
그렇기에 바로 결과를 보면,

이 건 말그대로 정반대 같지만, NULL 값이 포함되어있지 않는다.!!!
그래서 NOT이 포함한 함수를 쓸대는 이 점을 잘 고려해서 사용해야 한다!!
이 점을 생각하지 못하고 NOT IN을 쓰고 NOT EXISTS를 사용했다가는 큰 혼란이 올 수 있으니, 이번에 꼭 알아가도록 합시다!ㅎ
아 추가적으로,
위에서 IN 함수 같은경우에는 서브쿼리가 아닌 단순 값으로도 가능하다 했었는데, 잠깐만 보고 가자.
쿼리로 보면,
SELECT A.B_COLUMN, A.A_COLUMN FROM TEST_IN_AND_EXISTS A WHERE A.B_COLUMN IN ('1', '2');
SELECT A.B_COLUMN, A.A_COLUMN FROM TEST_IN_AND_EXISTS A WHERE A.B_COLUMN NOT IN ('1', '2'); |
위와 같이 서브쿼리 대신 단순 값으로 사용 할 수 있고,
결과를 보면,
<IN 함수>
<NOT IN 함수>
IN 함수에서는 1,2 값을 포함한 결과값을 볼 수 있고, NOT IN 함수에서는 NULL값을 포함하지 않고 1,2 값을 포함하지 않은 결과 값을 볼 수 있게 된다.
저 같은 경우에는 IN, NOT IN 만을 썼었는데,
EXISTS와 NOT EXISTS을 알게 되면서 다른 분들도 같이 알면 좋겠다는 생각이 들어 포스팅을 하게되었습니다.
이 글을 보시는 분들 중에 두가지 중에 한가지만 알거나 하나도 모르거나 먼가 빠트린 점이 있으셨던 분들에게 도움이 되셨기를 바랍니다!ㅎ
(아! 그리고 혹시나 제가 잘못 이해 하고 있는 점이 있으면.. 조언 부탁드리겠습니다!)