티스토리 뷰

반응형

sql을 다루다 보면 필연적으로 자주 볼 수밖에 없는 게 바로

JOIN이다.

join 은 일반적으로 두종류 이상의 테이블을 특정한 키값을 매개로 하여 합치는 역할을 한다.

위에서 말한 테이블 join을 할 때 "on"절을 사용해서 조건값을 매개로 하게 되는데

두 테이블을 합치기 위한 조건이라고 보면 된다.

여기서 궁금한 점이 하나 생길 수 있다.

sql에서는 이미 조건을 주기위한 "where"이란 키워드가 존재하기 때문이다.

join을 할 때 거의 조건반사로 on절을 사용하고 있는 사람들이 많을거라고 생각한다.

on과 where 둘다 조건을 주기위한 키워드이긴 하지만 어떻게 사용하냐에 따라서 결과값이 달라지기 때문에

한번쯤은 어떤 차이점이 있는지 짚고 넘어가야할 필요가 있을 것 같아서 오늘 간단히 정리하게 되었다.


예를 들어

다음과 같은 #testA, #testB 테이블이 있다고 가정하자.

select 1  as 'A', 2 as 'B'
into #testA

insert #testA
select 3, 5 union all
select 7, 9 union all
select 11, 13

select 1 as 'A', 3 as 'C'
into #testB

insert #testB
select 7, 5

#testA와 #testB 테이블을 각 테이블의 A컬럼값으로 left join 한다고 가정하고

먼저, 그냥 join을 해보면 쿼리와 결과는 다음과 같다.

 select *

from #testA a

left join #testB 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



그럼 두 번째로 join한 다음 where절을 사용하여 b테이블에서 C컬럼이 3인것만 가져오도록 한다면

쿼리와 결과는 다음과 같다.

select * from #testA a left join #testB b on a.A = b.A where b.c = 3 ------------------------------------------- A B A C 1 2 1 3


두 테이블을 join하는 조건이 on에 있는지 where에 있는지를 잘 봐두고...

세 번째로 b테이블의 c컬럼 조건을 where절이 아닌 on절에 줘보도록 하면 쿼리와 결과는 다음과 같다.

select * from #testA a left join #testB 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


이 비슷해 보이는 세 쿼리의 결과값은 모두 다르게 나오도록 되어있다.

왜 때문에 이런 차이점이 발생하는 것일까를 생각해 보는 게 오늘의 목적이다.

편의상 순서대로 1번, 2번, 3번 쿼리라고 정한다면

1번은 #testA테이블과 #testB테이블을 A컬럼의 값이 동일한 놈들을 left join 하도록 하는 것이다.

따라서 #testA테이블의 모든 값과 #testB테이블에서 A컬럼이 동일한 값인 1, 7 그리고 나머지는 null을 반환한다.

2번은 where절에서 #testB테이블의 c컬럼의 값이 3인 것을 가져오도록 조건을 주었다.

따라서 1번의 결과에서 #testB테이블의 c컬럼이 3인 것만 결과로 반환한다.

3번은 on절에서 두 테이블의 a컬럼이 같은것, b테이블의 c컬럼의 값이 3인 조건을 사용했다.

따라서 join을 할 당시에 #testB테이블의 c컬럼의 값이 3인것만을 대상으로 테이블 join이 발생하게되어

#testB 테이블에서 c컬럼의 값이 3이 아닌것들이 제외되고 null을 반환하게 된 것이다.


결론.

on절과 where절은 모두 결과를 반환하기 위한 조건을 걸기위해 사용하는 키워드 이지만

on절에서 사용하는 조건은 테이블 join을 할 때 범위를 주는 것이고

where절은 결과값이 나온것을 가지고 조건을 줘서 최종결과를 내기 위한 키워드정도로 정리할 수 있을 것 같다.

사용하는 방법에 따라 다른 결과를 가져올 수 있는 만큼

join에 대한 결과가 내가 기대했던 것과 다르게 나온다면 어느 곳에 조건을 걸었는지 살펴볼 필요가 있다.



반응형
댓글
반응형
05-17 05:57
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함