[SQL] JOIN ON, WHERE 차이
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이 된 다음에 걸러지는 조건이란걸 알 수 있다.