DataBase

[SQL] JOIN ON, WHERE 차이

Beencle 2023. 3. 21. 10:57

DB의 쿼리를 만들다보면 JOIN을 많이 사용하게 되는데 ON과 WHERE문으로 조건을 만들어 JOIN을 하게 된다.

ON과 WHERE 둘 다 조건에 관한 함수인데 이 둘의 차이점을 알아보자.

먼저 알아야할 것은 SQL의 문법 실행 순서이다.

SQL의 실행 순서를 자세히 보면 ON과 JOIN, WHERE 따로 나눠져있으며 순서도 다르다.

TABLE01 TABLE02
A B A C
1 2 1 3
3 5 7 5
7 9    
11 13    

위와 같은 두개의 테이블이 있다고 하고 설명을 해보자.

 

1.  ON절 하나만 사용

SELECT * FROM TABLE01 a LETF JOIN TABLE02 b ON a.A = b.A;

[결과]

A B A C
1 2 1 3
3 5 NULL NULL
7 9 7 5
11 13 NULL NULL

단순한 LEFT OUTER JOIN의 결과를 볼 수 있다. 두 테이블을 합치고 TABLE01의 테이블을 기준으로 TABLE02를 합치는데 02에 데이터가 01에 없다면 NULL로 채워진 모습이다.

 

2. ON과 WHERE 사용

SELECT * FROM TABLE01 a LEFT JOIN TABLE02 b ON a.A = b.A WHERE b.C = 3;

[결과]

A B A C
1 2 1 3

이전에 ON절만 사용했을 때와 다르게 데이터가 적게 나온 모습이다.

SQL에 실행 순서는 ON JOIN WHERE인데 간단하게 설명을 하자면 ON을 통해 OUTER JOIN이 이뤄지고 그 중에 WHERE문을 통과한 데이터만 출력이 된 것이다. 

 

3. ON 두개 사용

SELECT * FROM TABLE01 a LETF JOIN TABLE02 b ON a.A = b.A AND b.C = 3;

[결과]

A B A C
1 2 1 3
3 5 NULL NULL
7 9 NULL NULL
11 13 NULL NULL

위의 결과를 통해 어떻게 이런 결과 값이 나왔는지 생각해보자. 먼저 ON의 첫번째 조건이 a.A = b.A 조건을 보면 2개의 레코드가 존재하지만 그 뒤에 b.C = 3 조건을 통해 한번 걸러진 TABLE02의 결과 값들이 한번 더 걸러지고 결구 1, 3에 해당하는 레코드만 JOIN이 되었고 나머지 값은 LEFT OUTER JOIN이기 때문에 NULL로 반환된 모습이다.

 

[정리]

위의 3가지 쿼리와 결과를 보고 알 수 있는 것은 ON은 JOIN을 할 때 추출된 데이터의 조건이고 WHERE은 JOIN이 된 다음에 걸러지는 조건이란걸 알 수 있다.