Exists 작동원리

박준우·2023년 10월 11일

짤팁

목록 보기
2/5

1. Exists 기능

Exists 조건절은 일반 조인문 (where A.ID = B.ID)과 달리 메인쿼리에서 레코드 건건히 서브쿼리와 조인하여 조인에 성공시 출력, 다음 서브쿼리와의 조인을 처리하지 않고 다음 메인쿼리 레코드로 넘어가서 조인하는 방법이다.

2. Exists의 사용형식

Exists (서브쿼리);

ex) 
select 연습A.A_ID, 연습A.B_ID
from 연습A
where exists (select 1 from 연습B where 연습B.A_ID = 연습A.A_ID);

3. Exists 사용예

create table 연습A (A_ID number(10) , B_ID VARCHAR2(10));
create table 연습B (A_ID number (10) , B_ID VARCHAR2(10));

insert into 연습A values ('10', '가철수');
insert into 연습A values ('20', '나철수');
insert into 연습A values ('30', '다철수');

insert into 연습B values ('10', '가철수');
insert into 연습B values ('10', '가철수');
insert into 연습B values ('20', '나철수');
insert into 연습B values ('30', '다철수');

위 쿼리 실행시 다음의 데이터가 생성된다.
테이블 A

테이블 B

일반조인문
위 데이터에서 조인문을 사용하면 아래와 같은 과정을 통해 결과 집합을 출력한다.

select 연습A.A_ID, 연습A.B_ID
from 연습A, 연습B
where 연습A.A_ID = 연습B.A_ID;

Exists사용
Exists를 사용하면, 일반 조인과 달리 테이블 B의 첫번째 레코드인 A_ID (10) B_ID (가철수)와 조인 후에 두번쨰 레코드인 A_ID (10) B_ID (가철수)와 조인하지 않고 탈출하여 다음 메인쿼리 레코드인 A_ID (20) B_ID (나철수)부터 조인을 시작한다.

select 연습A.A_ID, 연습A.B_ID
from 연습A
where exists (select 1 from 연습B where 연습B.A_ID = 연습A.A_ID);

결국 메인쿼리 결과건수 만큼의 결과가 나왔다.

4.Exists의 효능

만약 A테이블의 특정데이터(ex A_ID = 10)를 B테이블에도 존재하는지 찾아야 할 때, 일반조인문을 사용한다고 생각해보자. 일반 조인문이더라도 A테이블과 B테이블을 비교해 같은 값이 존재하는지 확인할 수 있다. 다만 A테이블과 B테이블이 1:M관계 일 때, B테이블의 A_ID가 10인 case가 수백만건이라면, 그냥 값이 존재하는지만 찾아내면 되는데도 수백초의 시간이 걸릴 것이다. 이 때 Exists를 사용시 단시간에 결과를 불러올 수 있다.

profile
DB가 좋아요

0개의 댓글