-- 문법
SELECT tableA.column1, tableB,column1,... -- 다중테이블 호출 시 table이름.칼럼명을 명시해야한다
FROM tableA -- LEFT TABLE
LEFT JOIN | RIGHT JOIN | INNER JOIN | FULL JOIN tableB -- RIGHT TABLE
ON tableA.column1 = tableB.column1 -- 두 테이블의 JOIN 기준을 제공, 각 칼럼에 같은 DATA만 가져옴
WHERE condition;
두 개의 테이블에서 공통영역을 포함해 왼쪽 OR 오른쪽 테이블의 데이터를 포함하여 가져옴
LEFT JOIN인 경우 공통영역+왼쪽 테이블의 데이터를 가져오는데 오른쪽 테이블에 없는 데이터라면 NULL값으로 호출됨
(예제)
mysql> select celeb.ID, celeb.NAME, snl_show.ID, snl_show.HOST, snl_show.SEASON
-> from celeb
-> right join snl_show
-> on celeb.name = snl_show.host;
-- left table(celeb)과 right table(snl_show)의 공통 영역인 name과 host는 정적으로 불러왔고,
-- select에서 snl_show.season 칼럼의 데이터는 left table(celeb)에 없기 때문에 NULL로 불러온 것
+------+--------+----+--------+--------+
| ID | NAME | ID | HOST | SEASON |
+------+--------+----+--------+--------+
| 4 | 강동원 | 1 | 강동원 | 8 |
| 5 | 유재석 | 2 | 유재석 | 8 |
| 6 | 차승원 | 3 | 차승원 | 8 |
| 7 | 이수현 | 4 | 이수현 | 8 |
| NULL | NULL | 5 | 이병헌 | 9 |
| NULL | NULL | 6 | 하지원 | 9 |
| NULL | NULL | 7 | 제시 | 9 |
| NULL | NULL | 8 | 조정석 | 9 |
| NULL | NULL | 9 | 조여정 | 9 |
| NULL | NULL | 10 | 옥주현 | 9 |
+------+--------+----+--------+--------+
두 테이블의 공통 부분과 공통되지 않은 부분을 가져옴
단, MySQL에서 지원되지 않고 다른 DBMS에선 사용 가능
MySQL에서 FULL OUTER JOIN과 같은 결과, 대체 문법으로는 아래와 같이 쓸 수 있다
mysql> select celeb.ID, celeb.NAME, snl_show.ID, snl_show.HOST
-> from celeb
-> left join snl_show
-> on celeb.NAME = snl_show.HOST
-> UNION
-> select celeb.ID, celeb.NAME, snl_show.ID, snl_show.HOST
-> from celeb
-> right join snl_show
-> on celeb.NAME - snl_show.HOST;
+------+--------+------+--------+
| ID | NAME | ID | HOST |
+------+--------+------+--------+
| 1 | 아이유 | NULL | NULL |
| 2 | 이미주 | NULL | NULL |
| 3 | 송강 | NULL | NULL |
| 4 | 강동원 | 1 | 강동원 |
| 5 | 유재석 | 2 | 유재석 |
| 6 | 차승원 | 3 | 차승원 |
| 7 | 이수현 | 4 | 이수현 |
| NULL | NULL | 1 | 강동원 |
| NULL | NULL | 2 | 유재석 |
| NULL | NULL | 3 | 차승원 |
| NULL | NULL | 4 | 이수현 |
| NULL | NULL | 5 | 이병헌 |
| NULL | NULL | 6 | 하지원 |
| NULL | NULL | 7 | 제시 |
| NULL | NULL | 8 | 조정석 |
| NULL | NULL | 9 | 조여정 |
| NULL | NULL | 10 | 옥주현 |
+------+--------+------+--------+
두 개의 테이블에서 공통 된 요소들을 결합
-- 예제) snl_show테이블의 호스트 출연자 중 celeb 테이블을 기준으로 각 테이블 id,이름을 INNER JOIN
mysql> select celeb.ID, celeb.NAME, snl_show.ID, snl_show.HOST
-> from celeb
-> INNER JOIN snl_show
-> on celeb.name = snl_show.host;
+----+--------+----+--------+
| ID | NAME | ID | HOST |
+----+--------+----+--------+
| 4 | 강동원 | 1 | 강동원 |
| 5 | 유재석 | 2 | 유재석 |
| 6 | 차승원 | 3 | 차승원 |
| 7 | 이수현 | 4 | 이수현 |
+----+--------+----+--------+
select tableA.column1, tableA.column2, tableB.column1, tableB.column2,...
from tableA, tableB -- JOIN 문법과 다르게 from절에 테이블 2개 호출
where tableA.colmn1 = tableB.column1; -- ON이 아닌 where 절에 두 테이블을 JOIN 시킬 기준 제공 -- 예제) snl_show테이블의 호스트 출연자 중 celeb 테이블을 기준으로 각 테이블 id,이름을 SELF JOIN
select celeb.ID, celeb.NAME, snl_show.ID, snl_show.HOST
from celeb, snl_show
where celeb.NAME = snl_show.HOST;
+----+--------+----+--------+
| ID | NAME | ID | HOST |
+----+--------+----+--------+
| 4 | 강동원 | 1 | 강동원 |
| 5 | 유재석 | 2 | 유재석 |
| 6 | 차승원 | 3 | 차승원 |
| 7 | 이수현 | 4 | 이수현 |
+----+--------+----+--------+-- 🤔만약 where 절에서 두 테이블을 JOIN 시킬 수 없는 기준을 준다면?
select celeb.ID, celeb.NAME, snl_show.ID, snl_show.HOST
from celeb, snl_show
where celeb.BIRTHDAY = snl_show.BROADCAST_DATE;
-- 데이터타입은 날짜형태로 같지만 서로에게 없는 데이터이기 때문에 아래와 같은 결과가 나옴
Empty set (0.00 sec)