Home [MySQL] JOIN ON 1 = 1
Post
Cancel

[MySQL] JOIN ON 1 = 1

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;

두 쿼리는 모두 같은 결과를 반환한다.

ab
1NULL
1a
1b
1c
2NULL
2a
2b
2c
3NULL
3a
3b
3c


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문을 쉽게 만들기 위해 사용한다.

This post is licensed under CC BY 4.0 by the author.