오라클 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'을 적절히 선택하는 것이 중요합니다.
'DB > Oracle' 카테고리의 다른 글
[Oracle] TRIM, LTRIM, RTRIM 함수 사용방법 (0) | 2021.02.15 |
---|---|
[Oracle] SQL 중복제거 DISTINCT 사용법 (0) | 2021.02.08 |
[Oracle] 오라클 날짜 타입(TYPE)별 비교 - TO_CHAR,TO_DATE (4) | 2020.11.27 |
[Oracle] 오라클 시간 계산 / 표현식 (0) | 2020.11.25 |
[Oracle] MERGE문으로 INSERT, UPDATE문 실행하기 (0) | 2020.08.18 |
댓글