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을 알게 되면서 다른 분들도 같이 알면 좋겠다는 생각이 들어 포스팅을 하게되었습니다.

 

이 글을 보시는 분들 중에 두가지 중에 한가지만 알거나 하나도 모르거나 먼가 빠트린 점이 있으셨던 분들에게 도움이 되셨기를 바랍니다!ㅎ

 

(아! 그리고 혹시나 제가 잘못 이해 하고 있는 점이 있으면.. 조언 부탁드리겠습니다!)

 

+ Recent posts