: 두 개 이상의 테이블을 결합하는 것
1. Inner JOIN: 두개의 테이블에서 공통된 요소들을 통해 결합하는 조인방식(교집합)
SELECT column 1, column 2 ...
From table A
INNER JOIN table B
ON table A. column = tableB. column
WHERE conditions: (조건이 있다면)
INNER JOIN 예제:
SNL_SHOW 에 호스트로 출연한 celeb을 기준으로, celeb 테이블과 SNL_SHOW 테이블을 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 column 1, column 2 ...
From table A
LEFT JOIN table B
ON table A. column = tableB. column
WHERE conditions: (조건이 있다면)
LEFT JOIN 예제:
SNL_SHOW 호스트로 출연한 CELEB 을 기준으로 CELEB 테이블과 SNL_SHOW 테이블을 LEFT 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;
+----+--------+------+--------+
| id | name | id | host |
+----+--------+------+--------+
| 1 | 아이유 | NULL | NULL |
| 2 | 이미주 | NULL | NULL |
| 3 | 송강 | NULL | NULL |
| 4 | 강동원 | 1 | 강동원 |
| 5 | 유재석 | 2 | 유재석 |
| 6 | 차승원 | 3 | 차승원 |
| 7 | 이수현 | 4 | 이수현 |
+----+--------+------+--------+
✅ 왼쪽은 celeb / 오른쪽은 snl_show : 왼쪽은 celeb 이지만 snl_show 에 출연한 적 없음. 그래서 RIGHT 값은 NULL
SELECT column 1, column 2 ...
From table A
RIGHT JOIN table B
ON table A. column = tableB. column
WHERE conditions: (조건이 있다면)
RIGHT JOIN 예제:
SNL_SHOW 호스트로 출연한 CELEB 을 기준으로 CELEB 테이블과 SNL_SHOW 테이블을 RIGHT JOIN 해주세요.
mysql> 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 |
+------+--------+----+--------+
| 4 | 강동원 | 1 | 강동원 |
| 5 | 유재석 | 2 | 유재석 |
| 6 | 차승원 | 3 | 차승원 |
| 7 | 이수현 | 4 | 이수현 |
| NULL | NULL | 5 | 이병헌 |
| NULL | NULL | 6 | 하지원 |
| NULL | NULL | 7 | 제시 |
| NULL | NULL | 8 | 조정석 |
| NULL | NULL | 9 | 조여정 |
| NULL | NULL | 10 | 옥주현 |
+------+--------+----+--------+
✅ MySQL 에서는 FULL JOIN 을 지원하지 않기 때문에 아래와 같은 쿼리를 사용함:
SELECT column 1, column 2 ...
From table A
LEFT JOIN table B
ON table A. column = tableB. column
UNION
SELECT column 1, column 2 ...
From table A
RIGHT JOIN table B
ON table A. column = tableB. column
Full Outer Join 예제:
snl_show 에 호스트로 출연한 celeb을 기준으로, celeb 테이블과 snl_show 테이블을 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 | 5 | 이병헌 |
| NULL | NULL | 6 | 하지원 |
| NULL | NULL | 7 | 제시 |
| NULL | NULL | 8 | 조정석 |
| NULL | NULL | 9 | 조여정 |
| NULL | NULL | 10 | 옥주현 |
+------+--------+------+--------+
SELECT column 1, column 2 ...
From table A, table B
WHERE condition;
SELF JOIN 예제 1:
snl_show 에 호스트로 출연한 celeb을 기준으로 celeb 테이블과,
snl_show 테이블을 self join
mysql> 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 | 이수현 |
+----+--------+----+--------+
SELF JOIN 예제 2:
celeb 테이블의 연예인 중, snl_show에 host 로 출연했고, 소속사가 안테나인 사람의 이름과 직업을 검색해주세요.
STEP 1: celeb 테이블의 연예인 중, 소속사가 안테나인 사람의 이름과 직업.
mysql> select name, job_title
-> from celeb
-> where agency = '안테나';
+--------+------------+
| name | job_title |
+--------+------------+
| 유재석 | MC, 개그맨 |
+--------+------------+
STEP 2: celeb 테이블의 연예인 중, snl_show host 로 출연한 사람.
mysql> select celeb.name, snl_show.host
-> from celeb, snl_show
-> where celeb.name = snl_show.host;
+--------+--------+
| name | host |
+--------+--------+
| 강동원 | 강동원 |
| 유재석 | 유재석 |
| 차승원 | 차승원 |
| 이수현 | 이수현 |
+--------+--------+
STEP 3: 합치기
mysql> select celeb.name, celeb.job_title
-> from celeb, snl_show
-> where celeb.name = snl_show.host and celeb.agency='안테나';
+--------+------------+
| name | job_title |
+--------+------------+
| 유재석 | MC, 개그맨 |
+--------+------------+
SELF JOIN 예제 3:
celeb 테이블의 연예인 중, snl_show에 host로 출연했고, 영화배우는 아니면서
YG 소속이거나, 40세 이상이면서 YG 소속이 아닌 연예인의 이름과, 나이, 직업,
소속사, 시즌, 에피소드 정보를 검색해주세요.
Step 1: celeb 테이블의 연예인 중, 영화배우는 아닌 사람.
mysql> select * from celeb where not job_title like '%영화배우%';
step 2: celeb 테이블의 연예인 중, 영화배우는 아니면서 YG 소속.
select * from celeb where not job_title like '%영화배우%' and agency ='YG';
step 3: 나이가 40세 이상이면서 YG 소속이 아닌 사람.
select * from celeb where age >= 40 and agency != 'YG';
step 4: celeb 테이블의 연예인 중, snl_show 에 host로 출연, 영화배우는 아니면서 YG 소속
select celeb.id, celeb.name, snl_show host
-> from celeb, snl_show
-> where celeb.name = snl_show.host;
-> and NOT job_title like '%영화배우%' and agency='YG';
✨합치기:
select celeb. name, celeb.age, celeb.job_title, celeb.agency, snl_show.season, snl_show.episode
-> from celeb, snl_show
-> where celeb.name = snl_show.host
-> AND ((not job_title like '%영화배우%' and agency ='YG') OR
(age >=40 and agency != 'YG'));
+--------+------+------------+--------+--------+---------+
| name | age | job_title | agency | season | episode |
+--------+------+------------+--------+--------+---------+
| 유재석 | 50 | MC, 개그맨 | 안테나 | 8 | 8 |
| 이수현 | 23 | 가수 | YG | 8 | 10 |
+--------+------+------------+--------+--------+---------+