스파르타 spring 2기 TIL day7

fart man·2025년 12월 1일

sql join

sql join은 두 테이블을 join한다. 정확히 말하면 left table에 있는 row들과 right table에 있는 row들을 짝을 지어 서로 갖다 붙인걸 모아 새 테이블을 만든다.

그럼 도대체 어떻게 둘을 짝을 지어 갖다 붙일까?

두 테이블을 보자.

mysql> select * from t_left;
+-------+
| value |
+-------+
| a     |
| b     |
+-------+
2 rows in set (0.01 sec)

mysql> select * from t_right;
+-------+
| value |
+-------+
|     1 |
|     2 |
|     3 |
+-------+
3 rows in set (0.00 sec)

이 둘의 row를 섞을 수 있는 모든 조합의 경우를 정리해 보자

table

이걸 sql도 cross join을 이용해 할 수 있다.

mysql> select * from t_left cross join t_right;
+-------+-------+
| value | value |
+-------+-------+
| b     |     1 |
| a     |     1 |
| b     |     2 |
| a     |     2 |
| b     |     3 |
| a     |     3 |
+-------+-------+
6 rows in set (0.00 sec)

그리고 on 은 이 모든 조합 중에서 뭘고를지 선택하는 문이다.

on을 사용하기 위해서는 cross가 아닌 inner나 left, right를 사용해야 한다(필수로 on이 있어야 한다).

일단 cross join과 똑같지만 on을 사용해야 하는 inner를 살펴보자.

mysql> select * from t_left inner join t_right on true;
+-------+-------+
| value | value |
+-------+-------+
| b     |     1 |
| a     |     1 |
| b     |     2 |
| a     |     2 |
| b     |     3 |
| a     |     3 |
+-------+-------+

저위에서 보다시피 true를 쓰면 그냥 모든 조합이 통과되므로 cross와 똑같다.

하지만, on한테 좀 거르라고 하면,

mysql> select * from t_left inner join t_right on t_left.value='a' and t_right.value in (1, 2);
+-------+-------+
| value | value |
+-------+-------+
| a     |     1 |
| a     |     2 |
+-------+-------+
2 rows in set (0.00 sec)

잘 걸러지는 것을 확인 할 수 있다.

그럼 left랑 right는 왜 있는 걸까?

위 테이블을 다시 보자.

mysql> select * from t_left inner join t_right on t_left.value='a' and t_right.value in (1, 2);
+-------+-------+
| value | value |
+-------+-------+
| a     |     1 |
| a     |     2 |
+-------+-------+
2 rows in set (0.00 sec)

t_left에서 'b' 가 있는 row는 다 걸러졌다. 그리고 t_right에서 3이 있는 row도 다 걸러졌다. 얘네를 좀 끼어줄 수는 없을까?

left 와 right를 쓰면 가능하다.

위와 똑같은데 'inner'만 'left'로 봐꾸자.

mysql> select * from t_left left join t_right on t_left.value='a' and t_right.value in (1, 2);
+-------+-------+
| value | value |
+-------+-------+
| a     |     2 |
| a     |     1 |
| b     |  NULL |
+-------+-------+
3 rows in set (0.00 sec)

t_left에서 'b'도 포함되었다! 비록 b가 있는 줄은 다 걸러졌지만 left join 은 왼쪽에 있는 테이블 중에 on때문에 걸러진 줄이 있으면 오른쪽에 NULL을 붙여서 끼어넣어 준다.

right join은 left join 의 반대다.

mysql> select * from t_left right join t_right on t_left.value='a' and t_right.value in (1, 2);
+-------+-------+
| value | value |
+-------+-------+
| a     |     1 |
| a     |     2 |
| NULL  |     3 |
+-------+-------+
3 rows in set (0.00 sec)

빠진 3이 다시 들어갔다.

근데 lateral join은 어떻게 작동한것이여?

그건 담에.

0개의 댓글