SQL: JOIN / SELF JOIN

보라·2024년 1월 23일
0

Ch. 5 SQL

목록 보기
8/14

JOIN

: 두 개 이상의 테이블을 결합하는 것

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 | 이수현 |
+----+--------+----+--------+

  1. Left JOIN: 두개의 테이블에서 공통영역을 포함해, 왼쪽 테이블의 다른 데이터를 포함하는 조인 방식

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

  1. Right Join: 두 개의 테이블에서 공통영역을 포함해, 오른쪽 테이블의 다른 데이터를 포함

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 | 옥주현 |
+------+--------+----+--------+

  1. Full Outer Join: 두 개의 테이블에서 공통영역을 포함하여 양쪽 테이블의 다른 영역을 모두 포함하는 조인방식

✅ 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 | 옥주현 |
+------+--------+------+--------+

SELF JOIN

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 |
+--------+------+------------+--------+--------+---------+

profile
데이터 분석 취준생

0개의 댓글