DB/Oracle

[Oracle] EXISTS와 IN 함수 차이 비교

콩다영 2021. 2. 4.
728x90

오라클 EXISTS함수와 IN함수 차이 비교 (NOT EXISTS, NOT IN)

 

 

쿼리문을 작성할 때 WHERE절에서 사용되는 조건 EXISTS함수와 IN함수의 차이를 비교해보자 !

어떤 점이 다르고 언제 EXISTS함수를 써야할지 IN함수를 써야할지 정리해본당 ( * _ *)

 


 

'EXISTS'함수와 'IN'함수는 WHERE절에서 서브쿼리를 사용하여 조건을 걸 때 자주 사용됩니다.

두 함수는 비슷한 목적을 가지고 있지만, 사용 방식과 성능 면에서 차이가 있습니다.

이 두 함수를 비교하여 언제 어떤 함수를 사용하는 것이 좋은지 알아보겠습니다.

 

 

 

EXISTS 함수

EXISTS는 서브쿼리가 하나 이상의 행을 반환하는지 여부를 확인하는 데 사용됩니다. 서브쿼리가 행을 반환하면 'TRUE',  그렇지 않으면 'FALSE'를 반환합니다. 주로 서브쿼리 내의 조건이 충족되는지를 빠르게 확인할 때 유용합니다.

SELECT *
  FROM SAMPLE1 s1
 WHERE EXISTS (SELECT 1 FROM SAMPLE2 s2 WHERE s1.name = s2.name);

: ()안에 서브쿼리만 들어갈 수 있음. 특정값은 넣을 수 없다

: 처리순서    [메인 쿼리] -> [서브 쿼리]

: 서브쿼리에 대한 결과가 '존재하는지' 여부만 확인.

: NULL 값에 대해 TRUE를 리턴함.

 

 

IN 함수

IN은 주어진 리스트나 서브쿼리의 결과에 특정 값이 존재하는지 여부를 확인합니다. 리스트 내의 값과 일치하는 값을 찾습니다.

SELECT *
  FROM SAMPLE1 s1
 WHERE s1.name IN (SELECT s2.name FROM SAMPLE2 s2);

: ()안에 특정값이나 서브쿼리가 들어갈 수 있음.

: 처리순서    [서브 쿼리] -> [메인 쿼리]

: NULL값에 대해 FALSE를 리턴함. 따라서 NOT IN을 사용할 때는 NVL로 NULL체크 꼭 해주기 !!

 

 

NOT EXISTS와 NOT IN

- NOT EXISTS : 서브쿼리가 행을 반환하지 않을 때 TRUE를 반환합니다.

SELECT *
  FROM employees e
 WHERE NOT EXISTS (SELECT 1 FROM departments d WHERE e.department_id = d.department_id);

 

- NOT IN : 리스트나 서브쿼리의 결과에 특정 값이 존재하지 않는 경우를 찾습니다.

                  NULL값을 처리하는 방법은 주의. NVL을 사용하여 NULL값을 안전하게 처리합니다.

SELECT *
  FROM employees e
 WHERE e.department_id NOT IN (SELECT NVL(d.department_id, -1) FROM departments d);

 

 

 

비교 및 사용 시기

[ 성능 ]

- EXISTS는 메인 쿼리의 각 행에 대해 서브쿼리가 한 번만 실행되며,

  조건을 만족하는 첫 번째 행을 찾으면 더 이상 수행하지 않기 때문에 더 효율적일 수 있습니다.

- IN은 서브쿼리가 전체 리스트를 반환하고, 메인 쿼리는 이 리스트와 매칭하는 값을 찾기 때문에

  대량의 데이터를 처리할 때 더 느릴 수 있습니다.

→ 대규모 데이터 집합을 처리할 때 'EXISTS'가 더 효율적일 수 있습니다.

 

[ NULL 처리 ]

- EXISTS는 NULL을 포함하여 조건을 만족하는지 확인합니다.

- IN은 NULL값을 무시하며, NULL값이 포함된 경우 'FALSE'를 반환합니다.

  따라서 'NOT IN'을 사용할 때는 'NVL'을 사용하여 NULL값을 처리해야 합니다.

→ NULL값을 다룰 때는 'EXISTS'가 더 간단하고 직관적입닌다.

→ 간단한 리스트나 소규모 데이터 집합을 다룰 때는 'IN'을 사용하는 것이 더 간단할 수 있습니다.

 

 

 

따라서 서브쿼리를 사용할 때는 데이터의 크기와 NULL값의 처리 방법을 고려하여

'EXISTS'와 'IN'을 적절히 선택하는 것이 중요합니다.

 

 

 

728x90
반응형

댓글