콘텐츠
SQL을 사용할 때 끊임없이 도전해야하는 것은 EXISTS 및 IN 연산자의 올바른 사용을 결정하는 것입니다. 두 연산자는 항상 같은 것은 아니지만 동일한 결과를 생성 할 수 있습니다. 또한 각 운영자의 속도 최적화 방법에 대한 상당한 논쟁이 있습니다. 사용자는 각 연산자의 다양한 속성을 이해하고 적절한 사용법을 결정하기 위해 두 연산자로 실험해야합니다.
EXISTS 또는 IN을 선택할 때 SQL 목표를 고려하십시오. (Jupiterimages / Photos.com / 게티 이미지)
IN 연산자
IN 연산자는 테이블의 필드 값이 IN 값 목록의 WHERE 조건을 만족하면 행을 반환합니다. 일반적으로 기본 쿼리의 일부로 사용되거나 하위 쿼리와 함께 사용됩니다.
예제 1 : WHERE table.field IN ( 'a', 'b', 'c') 예제 2 : WHERE table.field IN (집합을 반환하는 하위 쿼리)
EXISTS 연산자
하위 쿼리에 행이 포함되어 있으면 EXISTS 연산자는 모든 주요 행을 반환합니다. 하위 쿼리와 함께 만 사용됩니다. 반환 된 행은 기본 쿼리의 필터에 의해 결정됩니다.
예 : WHERE EXISTS (집합을 반환하는 하위 쿼리)
차이점
IN 연산자는 NULL 값을 평가할 수 없으므로 NULL 값을 가진 행을 평가하고 반환하는 EXISTS 연산자와 달리 이러한 행은 항상 거짓이며 반환되지 않습니다.
유사점
EXISTS 및 IN은 상관 관계가 있고 상관되지 않은 하위 쿼리를 지원하며 둘 다 비슷한 결과를 산출 할 수 있습니다. 상관 관계가 설정되면 하위 쿼리 필드의 기본 쿼리 필드 (예 : principal.id = subquery.id)를 충족시킵니다. 하위 쿼리는 발견 된 각 항목에 대해 행별로 평가합니다. 이 경우 IN 및 EXISTS는 유사한 "id"조건을 기반으로 동일한 행을 반환합니다. 상관 관계가없는 경우 두 연산자는 하위 쿼리를 처리 한 다음 주 쿼리에 대한 결과를 결합합니다.
실적
성능은 데이터베이스 최적화 프로그램과 실행 된 코드에 사용 된 실행 계획에 의해 결정됩니다. EXISTS 및 IN의 경우 옵티마이 저는 다른 경로를 선택할 수 있습니다. Oracle에서는 NOT EXISTS가 일반적으로 NOT IN보다 빠릅니다. 결국, 데이터베이스와 사용중인 버전에 따라 최단 경로를 정렬하기 위해 일부 시도와 오류가 필요합니다. 정확한 결과를 보장하는 오퍼레이터를 사용하고 오퍼레이터를 교체하여 가장 빠른 것을 확인하십시오.