오라클의 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 |
제가 이해가 잘 안된부분은 서브쿼리였는데..
(사실.. 저 서브쿼리가 멀 나타내주는지를 정확히는 이해를 못한 상태입니다..)
단순하게 생각하면 두테이블을 비교하는데 조건을 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 |
같은 의미를 지닐수 있도록 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 |
EXISTS쿼리 의미에서 NOT 이 붙음으로써 딱 반대되는 의미이다.
그렇기에 바로 결과를 보면,
말그대로 딱 정반대의 A테이블의 나머지 3개의 데이터를 가진 결과가 나온다. NULL값을 포함한..
그다음 NOT IN 쿼리를 보면,
SELECT A.B_COLUMN, A.A_COLUMN |
IN쿼리 의미에서 NOT 이 붙음으로써 딱 반대되는 의미이다.
그렇기에 바로 결과를 보면,
이 건 말그대로 정반대 같지만, NULL 값이 포함되어있지 않는다.!!!
그래서 NOT이 포함한 함수를 쓸대는 이 점을 잘 고려해서 사용해야 한다!!
이 점을 생각하지 못하고 NOT IN을 쓰고 NOT EXISTS를 사용했다가는 큰 혼란이 올 수 있으니, 이번에 꼭 알아가도록 합시다!ㅎ
아 추가적으로,
위에서 IN 함수 같은경우에는 서브쿼리가 아닌 단순 값으로도 가능하다 했었는데, 잠깐만 보고 가자.
쿼리로 보면,
SELECT A.B_COLUMN, A.A_COLUMN
SELECT A.B_COLUMN, A.A_COLUMN |
위와 같이 서브쿼리 대신 단순 값으로 사용 할 수 있고,
결과를 보면,
<IN 함수>
<NOT IN 함수>
IN 함수에서는 1,2 값을 포함한 결과값을 볼 수 있고, NOT IN 함수에서는 NULL값을 포함하지 않고 1,2 값을 포함하지 않은 결과 값을 볼 수 있게 된다.
저 같은 경우에는 IN, NOT IN 만을 썼었는데,
EXISTS와 NOT EXISTS을 알게 되면서 다른 분들도 같이 알면 좋겠다는 생각이 들어 포스팅을 하게되었습니다.
이 글을 보시는 분들 중에 두가지 중에 한가지만 알거나 하나도 모르거나 먼가 빠트린 점이 있으셨던 분들에게 도움이 되셨기를 바랍니다!ㅎ
(아! 그리고 혹시나 제가 잘못 이해 하고 있는 점이 있으면.. 조언 부탁드리겠습니다!)
'DB' 카테고리의 다른 글
[Oracle] CHAR, VARCHAR, VARCHAR2 (2) | 2017.08.21 |
---|---|
[Oracle] Windows10 sqldeveloper jvm.dll error (0) | 2017.02.23 |
Expected one result (or null) to be returned by selectOne(), but found: 2 (0) | 2014.12.06 |