다중 행(Multi Row) 서브쿼리 IN과 EXISTS 실행 순서 및 특징
1) IN : 실제 존재(일치)하는 데이터들의 모든 값까지 확인.
① SubQuery를 먼저 실행하여 출력되는 그에 대한 모든 row가져옴(따라서 사실 IN뒤의 괄호안에는 서브쿼리 이외에도 직접 요소 값을 적어줄 수 있음)
② 이후에는 MainQuery에서 하나의 row를 가져옴.
③ 그 row의 값이 ①에서 가져온 IN 이하의 요소들에 포함(일치)되어 있는지를 체크하고, SubQuery의 요소들 중 하나라도 일치한다면 그 row를 출력
④ ②번~③번 과정 반복하면서 결과 출력.
2) EXISTS : 단지 해당 row가 존재하는지만 확인하고, 더 이상 수행되지 않음.
① MainQuery를 먼저 실행하여 출력되는 상위 row가져옴.
② 해당 row에 대해서 SubQuery 실행. 이때, SubQuery 에 대한 결과가 존재하기만 한다면 True가 되어 ①에서 출력된 row 출력. → 말 그대로 EXISTS이하의 서브쿼리의 결과 값이 '존재하는지'를 확인하고 있다면 True. 없으면 False.
③ ①번~②번 과정 반복하면서 결과 출력.
즉, 방식에 따라 IN과 EXISTS는 같은 결과를 출력하기도 안 하기도 함. 포인트는 내부적으로 쿼리가 동작하는 방식은 아예 다르다는 것에 주의.
NOT IN 과 NOT EXISTS
1) NOT IN ← multiple OR인 IN과 논리적으로 반대인 NOR. 즉, ! and
NOT IN에 대한 IN의 경우 서브쿼리 값 중 일치하는 임의의 값이 하나라도 있으면 되지만, 반대로 NOT IN을 사용하면 서브쿼리의 임의 값과 불일치하는(즉, 모든 요소들과 일치하지 않는)지를 체크하는 것을 의미하게 된다. 그리고 DB에서 'NULL과의 비교 연산'은 항상 unknown(false) 값을 반환하게 됨. 따라서, 조건에 맞는 데이터가 있다고 하더라도 NULL이 존재하면 “on rows selected”라고 나옴. 그래서 NOT IN 사용 시 NVL 등(where절의 is not null 등)을 통한 null처리가 필요하다.
2) EXIST와 NOT EXISTS 비교
- EXISTS(서브쿼리): 서브쿼리 내 값이 존재함(True) → 메인쿼리의 결과 출력.
- NOT EXISTS(서브쿼리): 서브쿼리 내 값이 존재하지 않아야(False) → 메인쿼리의 결과 출력.
'Database' 카테고리의 다른 글
Oracle 그룹 함수(ROLLUP, CUBE, GROUPING SETS, GROUPING) 개념 정리 (0) | 2020.09.22 |
---|---|
[Oracle] 오라클 뷰(View) 특징 총정리 (0) | 2020.09.21 |
Oracle 서브쿼리(Sub Query) 사용법 & 예제 (0) | 2020.09.17 |
계층형 쿼리(Hierarchical Query) 개념 및 실행 순서 상세 정리 (0) | 2020.09.16 |
집합 연산자(union, union all, intersect, except) (0) | 2020.09.15 |