티스토리 뷰
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에 대한 결과가 내가 기대했던 것과 다르게 나온다면 어느 곳에 조건을 걸었는지 살펴볼 필요가 있다.
'DB(MS, Oracle, PG, MY..etc)' 카테고리의 다른 글
[MS-SQL] order by_열이름 [열이름]이 불확실 합니다. - 문제해결 (0) | 2020.03.22 |
---|---|
[MS-SQL] SQL Server SSMS에서 sp_helptext할 때 빈 행이 생기는 이슈에 대한 짧은 고민과 해결 (0) | 2019.05.22 |
oracle sql developer jdk버전 변경하기(msvcr120.dll 없음) - product.conf 수정 (4) | 2019.01.22 |
쿼리 작성 예제 - 연속된 날짜 집합 구하기(row_number) (1) | 2019.01.16 |
간단한 join과 sum을 사용한 누계 만들기 및 응용 (0) | 2019.01.15 |
- Total
- Today
- Yesterday
- 레트로게임
- 오락실게임
- 엑셀
- brawlstars
- 고전명작
- 고전게임
- 플래시
- XML
- 중독성짱게임
- 좀비게임
- 플래쉬게임
- Excel
- xml강좌
- 오락실 게임
- J.S Bach
- c#
- MS-SQL
- C
- 틀린그림찾기
- 브롤스타즈
- 8비트
- 추억의 게임
- SQL
- XML Programming with VB 6.0
- 8비트상성
- 다른그림찾기
- 플래쉬
- 플래시게임
- 플래시 게임
- 플래쉬 게임
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |