초급의 끄적거림

[MSSQL] IN 과 EXISTS 본문

DB/MSSQL

[MSSQL] IN 과 EXISTS

codingD 2020. 4. 24. 11:23

- IN 과 EXISTS는 WHERE 절에서 사용되며 조건에 맞는 데이터를 추출한다

일반적으로 IN 연산자는 특정 TABLE(VIEW) DATA의 ROW 값에 따른 다른 TABLE의 데이터를 추출해내고자 할 때 주로 사용함.
가끔 IN 연산자를 ORW가 이는지 체크하는 용도로 사용하기도 함
그러나 ROW가 존재하는지에 대해서는 EXISTS라는 연산자를 따로 제공함

1. 성능
 - EXISTS : 단지 조건에 해당하는 ROW의 존재 유무와 체크 후 더 이상 수행 안함
  : SELECT 절을 평가하지 않으므로 일반적으로 IN에 비해 성능이 좋음
 - IN    : 조건에 해당하는 ROW애 실제 존재하는 칼럼의 데이터들 비교하여 체크
  : SELECT 절에서 조회한 칼럼 값으로 비교하므로 EXISTS에 비해 성능이 떨어짐
  
2. 실행 순서
 - EXISTS : 메인 쿼리의 결과값을 서브 쿼리에 대입하여 조건 비교 후 결과 출력 (메인쿼리 -> EXISTS 쿼리)
 - IN    : 서브 쿼리의 결과값을 메인 쿼리에 대입하여 조건 비교 후 결과 출력 (IN 쿼리 -> 메인 쿼리)

3. NOT IN 과 NOT EXISTS의 NULL 처리
 - NOT EXISTS : NULL 데이터에 대해 TRUE 리턴
 - NOT IN    : NULL 데이터에 대해 FALSE를 리턴, NULL 처리를 하지 않을 경우 누락 발생.
 즉, NOT IN을 사용하면 조건에 맞는 데이터가 있다고 하더라도 NULL이 존재하면 "NO ROWS SELECTED"라고 나오기 때문에 꼭 NULL 처리가 필요함


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); 

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);

Comments