SQL로 데이터 분석을 하다가 모르는 문법이 나타났다.
아래와 같은 JOIN을 하는 경우 ON 조건에 관한 부분이었다.
1
table1 AS B JOIN table2 AS B ON 1 = 1
흔히 사용해오던 JOIN 방법은 다음과 같았다.
- ON table1.column = table2.column
- ON table.column BETWEEN A AND B
ON 1 = 1
이 뭐야?
도와줘요 구글맨~
JOIN ON 1 = 1
1 = 1
은 항상 참(True)
이다.
‘아무것도 없애지 마라’ 라는 뜻과도 같다.
얼핏 보면 ‘CROSS JOIN
하고 똑같은 거 아니야?’ 라는 생각을 할 수도 있다. 사실 나도 결과 테이블을 보고 처음엔 ‘CROSS JOIN인가?’ 라고 생각하였으나 잘 모르는 문법이고, 확신이 없어서 찾아보게 되었다.
그러나 CROSS JOIN과는 다르다. 그럼 어떤 부분이 다른 걸까?
CROSS JOIN과의 차이점
오른쪽 테이블이 행을 반환하지 않을 때 CROSS JOIN도 행을 반환하지 않는다. 그러나 ON 1 = 1
JOIN은 NULL을 사용하여 모든 행을 오른쪽 테이블로 반환한다.
이건 또 무슨 뜻이야? 라고 생각할 수 있으니 예시를 보자.
- A table
a |
---|
2 |
1 |
3 |
- B table
b |
---|
a |
b |
c |
NULL |
- C table (empty)
|c| |:—:|
A와 B를 JOIN할 경우
1
SELECT * FROM A LEFT JOIN B ON 1 = 1;
1
SELECT * FROM A CROSS JOIN B;
두 쿼리는 모두 같은 결과를 반환한다.
a | b |
---|---|
1 | NULL |
1 | a |
1 | b |
1 | c |
2 | NULL |
2 | a |
2 | b |
2 | c |
3 | NULL |
3 | a |
3 | b |
3 | c |
A와 C를 JOIN할 경우
1
SELECT * FROM A LEFT JOIN C ON 1 = 1;
|a|b| |:—:|:—:| |1|NULL| |3|NULL| |2|NULL|
1
SELECT * FROM A CROSS JOIN C;
|a|b| |:—:|:—:|
즉, 테이블 하나가 비어있지만 여전히 레코드는 원할 경우 1 = 1
을 사용하며, 문자열을 연결하여 동적 SQL문을 쉽게 만들기 위해 사용한다.