Read 쿼리를 짜다보면 원하는 조건을 걸게 되는데,
조인을 할 경우 join의 on, where은 join시키는 범위가 달라진다.
on에 조건을 걸면, join 대상 테이블을 on 조건에 따라 필터를 건 후에 join을 하고,
where절에 조건을 건다면, join 결과에 해당 조건으로 필터가 된다.
빅쿼리 공개 데이터셋으로 확인 해 보면 다음과 같다.
야구 경기 중, 낮 경기가 몇 경기였는지 보기 위해 쿼리를 작성하면,
select
b.dayNight day_night,
count( distinct a.gameId ) game_cnts,
from
`bigquery-public-data.baseball.games_wide` a
left join `bigquery-public-data.baseball.schedules` b on a.gameId = b.gameId
where 1=1
and b.dayNight = 'D'
group by 1
결과
select
b.dayNight day_night,
count( distinct b.gameId ) game_cnts,
from
`bigquery-public-data.baseball.games_wide` a
left join `bigquery-public-data.baseball.schedules` b on a.gameId = b.gameId
and b.dayNight = 'D'
where 1=1
group by 1
결과
Table b에서 daynight = 'D'인 경우만 가져와서 join하므로,
gameId와 매칭되지 않은 경기 정보들은 null값을 보인다.
해당 테이블의 경우 D( day, 낮 )와 N( night, 밤 )으로만 구분되어 있으므로, 여기서 null값은 밤 경기로 손쉽게 추정할 수 있다.
물론 낮/밤 경기 수 규모를 보려면 이렇게 하지는 않겠지만, where절과 join on 절의 차이를 보기 위해 기록 해 두는 것 이므로 이 점 감안해야겠다.