sql 의 in 과 not in, exists 와 not exists 의 차이

5429 단어 sql
1. in 과 exists
in 은 외모 와 내 표를 hash 로 연결 하 는 것 이 고 exists 는 대외 표 로 loop 순환 을 하 며 매번 loop 순환 을 통 해 내 표를 조회 하 는데 exists 가 in 보다 효율 이 높다 는 주장 은 정확 하지 않다 고 여 겨 왔 다.만약 조회 한 두 표 의 크기 가 비슷 하 다 면 in 과 exists 를 사용 하 는 것 은 차이 가 크 지 않다.만약 에 두 표 중 하 나 는 비교적 작고 하 나 는 비교적 크 면 서브 조회 표 가 큰 것 은 exists 를 사용 하고 서브 조회 표 가 작은 것 은 in 을 사용한다.
예 를 들 어 표 A (작은 시계), 표 B (큰 시계)
select * from A where cc in(select cc from B)  -->   ,   A  cc    ; select * from A where exists(select cc from B where cc=A.cc)  -->   ,   B  cc    。

반대로:
select * from B where cc in(select cc from A)  -->   ,   B  cc     select * from B where exists(select cc from A where cc=B.cc)  -->   ,   A  cc    。

2. not in 과 not exists not in 은 논리 적 으로 not exists 와 완전히 같 지 않 습 니 다. not in 을 잘못 사용 하면 프로그램 에 치 명 적 인 BUG 가 존재 하지 않도록 조심 하 십시오. 다음 의 예 를 보 세 요.
create table #t1(c1 int,c2 int);

create table #t2(c1 int,c2 int);

insert into #t1 values(1,2);

insert into #t1 values(1,3);

insert into #t2 values(1,2);

insert into #t2 values(1,null);



select * from #t1 where c2 not in(select c2 from #t2);  -->    : 

select * from #t1 where not exists(select 1 from #t2 where #t2.c2=#t1.c2)  -->    :1  3

보시 다시 피 not in 은 기대 하지 않 는 결과 집합 이 생 겨 논리 적 오류 가 있 습 니 다.상기 두 selection 문장의 집행 계획 을 보면 다 를 것 입 니 다. 후 자 는 hash 를 사 용 했 습 니 다.aj, 따라서 가능 한 한 not in 을 사용 하지 마 십시오.하위 조회 에서 되 돌아 오 는 임의의 기록 에 빈 값 이 있 으 면 조 회 는 기록 을 되 돌려 주지 않 습 니 다.하위 조회 필드 에 비 어 있 는 제한 이 있 으 면 not in 을 사용 할 수 있 으 며, 힌트 를 통 해 hasg 를 사용 할 수 있 습 니 다.aj 또는 mergeaj 연결.
검색 어 에 not in 을 사용 하면 내외 표를 모두 스 캔 하고 색인 을 사용 하지 않 습 니 다.not exists 의 하위 조 회 는 표 의 색인 을 사용 할 수 있 습 니 다.그래서 어떤 시계 가 크 든 not exists 를 사용 하 는 것 이 not in 보다 빠르다.
3. in 과 = 의 차이
select name from student where name in('zhang','wang','zhao');

화해시키다
select name from student where name='zhang' or name='wang' or name='zhao'

결 과 는 같다.

좋은 웹페이지 즐겨찾기