2013-11-26

이글은 필자가 자꾸 조인에 대해서 헷갈리고.. on과 where 의 차이점에 대해서도 헷갈려서 써두는 포스팅임을 밝혀둔다. 
(그래서 시작은 유명한... 조인이 한눈에 보이는 사진으로 시작해 본다.)
 
길게 설명하기 귀찮으니 그냥 쿼리로 끝내겠다.
 
mysql> select * from list;
+------+------+-------+
| year | id   | fee   |
+------+------+-------+
| 2008 | A    | 10000 |
| 2008 | A    | 15000 |
| 2008 | B    | 20000 |
| 2009 | B    | 10000 |
| 2009 | A    | 15000 |
| 2010 | C    | 10000 |
| 2010 | D    | 20000 |
+------+------+-------+
7 rows in set (0.03 sec)
 
mysql> select * from ids;
+-----+------+------+
| sid | year | id   |
+-----+------+------+
|   1 | 2007 | A    |
|   2 | 2008 | B    |
|   3 | 2010 | C    |
|   4 | NULL | D    |
+-----+------+------+
4 rows in set (0.00 sec)
 
mysql> select * from list t1 left join ids t2 on t1.id = t2.id;
+------+------+-------+------+------+------+
| year | id   | fee   | sid  | year | id   |
+------+------+-------+------+------+------+
| 2008 | A    | 10000 |    1 | 2007 | A    |
| 2008 | A    | 15000 |    1 | 2007 | A    |
| 2008 | B    | 20000 |    2 | 2008 | B    |
| 2009 | B    | 10000 |    2 | 2008 | B    |
| 2009 | A    | 15000 |    1 | 2007 | A    |
| 2010 | C    | 10000 |    3 | 2010 | C    |
| 2010 | D    | 20000 |    4 | NULL | D    |
+------+------+-------+------+------+------+
7 rows in set (0.00 sec)
 
mysql> select * from list t1 left join ids t2 on t1.id = t2.id where t2.id='A';
+------+------+-------+------+------+------+
| year | id   | fee   | sid  | year | id   |
+------+------+-------+------+------+------+
| 2008 | A    | 10000 |    1 | 2007 | A    |
| 2008 | A    | 15000 |    1 | 2007 | A    |
| 2009 | A    | 15000 |    1 | 2007 | A    |
+------+------+-------+------+------+------+
3 rows in set (0.00 sec)
 
mysql> select * from list t1 left join ids t2 on t1.id = t2.id and t2.id='A';
+------+------+-------+------+------+------+
| year | id   | fee   | sid  | year | id   |
+------+------+-------+------+------+------+
| 2008 | A    | 10000 |    1 | 2007 | A    |
| 2008 | A    | 15000 |    1 | 2007 | A    |
| 2008 | B    | 20000 | NULL | NULL | NULL |
| 2009 | B    | 10000 | NULL | NULL | NULL |
| 2009 | A    | 15000 |    1 | 2007 | A    |
| 2010 | C    | 10000 | NULL | NULL | NULL |
| 2010 | D    | 20000 | NULL | NULL | NULL |
+------+------+-------+------+------+------+
7 rows in set (0.00 sec)
 
뭐.. 쉽게 말해서.. on 안에 어떤 조건을 넣던지.. 왼쪽 테이블은 계속 유지가 되지만, where을 넣으면 결과값 전체에 대한 조건으로 취급되기 때문에 왼쪽 테이블이 유지가 되지 않는다는 소리다.
 
left join의 기본사항 이지만.... 조인은.. 안쓰다 보면.. 자꾸 까먹는다는게.... 안타깝.... ㅡ/.ㅡ