- INNER JOIN
- LEFT JOIN
- RIGHT JOIN
- FULL OUTER JOIN
- SELF JOIN
- SELF JOIN 예제
JOIN으로 테이블끼리 합쳐주는 실습을 위해
새로운 테이블과 데이터를 추가했당
그리고 이전시간까지 사용한 celeb 테이블을 사용할 것이다.
두 개의 테이블에서 "공통된 요소"들을 통해 결합하는 조인 방식. (교집합)
tableA, tableB의 조인 방식을 전해준 후,
ON 뒤에 "기준"을 정해준다.
SELECT column1, column2, ...
FROM tableA
INNER JOIN tableB
ON tableA.column = tableB.column
WHERE condition;
예제로 봐야겠엉
snl_show에 호스트로 출연한 celeb을 기준으로
celeb 테이블과 snl_show 테이블을 inner join:
select celeb.id, celeb.name, snl_show.id, snl_show.host
from celeb
inner join snl_show
on celeb.name = snl_show.host;
이름이 같은 컬럼에 한에서는 반드시 어느 table인지를 명시해야 한다.
단독 컬럼이여도, 헷갈리니까 table까지 같이 써주면 좋다.
두 개의 테이블에서 공통영역을 포함해 왼쪽 테이블의 다른 데이터(나머지 부분)도 포함하는 조인 방식.
SELECT column1, column2, ...
FROM tableA
LEFT JOIN tableB
ON tableA.column = tableB.column
WHERE condition;
FROM 뒤에 나오는 tableA가 left table이 되고,
tableB가 right table이 된다.
snl_show에 호스트로 출연한 celeb을 기준으로
celeb 테이블과 snl_show 테이블을 left join:
select celeb.id, celeb.name, snl_show.id, snl_show.host
from celeb
left join snl_show
on celeb.name = snl_show.host;
출연하지 않은 celeb정보들도 가져와졌다.
두 개의 테이블에서 공통영역을 포함해 오른쪽 테이블의 다른 데이터(나머지 부분)도 포함하는 조인 방식.
SELECT column1, column2, ...
FROM tableA
RIGHT JOIN tableB
ON tableA.column = tableB.column
WHERE condition;
snl_show에 호스트로 출연한 celeb을 기준으로
celeb 테이블과 sns_show 테이블을 right join:
select celeb.id, celeb.name, snl_show.id, snl_show.host
from celeb
right join snl_show
on celeb.name = snl_show.host;
celeb테이블에 없는, snl_show정보들도 가져와졌다.
두 개의 테이블에서 공통영역을 포함해 양쪽 테이블의 다른 영역들을 모두 포함하는 조인 방식. (합집합)
SELECT column1, column2, ...
FROM tableA
FULL OUTER JOIN tableB
ON tableA.column = tableB.column
WHERE condition;
snl_show에 호스트로 출연한 celeb을 기준으로
celeb 테이블과 sns_show 테이블을 full outer join:
-> error
full outer join은 mysql에서는 지원하지 않는다.
다른 dbms에서는 사용할 수 있고,
mysql에선 같은 결과를 만들기 위해서... left join과 right join의 결과를 union으로 합치는 쿼리를 사용하면 된다!!
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;
공통된 데이터와,
celeb테이블에만 있는 데이터,
snl_show테이블에만 있는 데이터들이
다 가져와졌다.
앞선 조인들보다 가장 많이 사용된다.
inner join(교집합)과 같은 결과를 가져온다.
SELECT column1, column2, ...
FROM tableA, tableB, ...
WHERE condition;
where절에서 조인 조건을 명시해주면 된다.
snl_show에 호스트로 출연한 celeb을 기준으로
celeb 테이블과 sns_show 테이블을 self join:
select celeb.id, celeb.name, snl_show.id, snl_show.host
from celeb, snl_show
where celeb.name = snl_show.host;
셀프조인 다양한 예제들로 살펴보기!
예제 1.
celeb 테이블의 연예인 중,
snl_show에 host로 출연했고
소속사가 안테나인 사람의 이름과 직업을 검색:
select celeb.name, celeb.job_title
from celeb, snl_show
where celeb.name = snl_show.host AND celeb.agency='안테나';
예제 2.
celeb 테이블의 연예인 중,
영화배우는 아니면서 YG엔터테인먼트 소속이거나
40세 이상이면서 YG엔터테인먼트 소속이 아닌 연예인의
이름과 나이, 직업, 소속사, 시즌, 에피소드 정보를 검색:
select celeb.name, celeb.job_title, celeb.agency, snl_show.season, snl_show.episode
from celeb, snl_show
where celeb.name = snl_show.host AND
((not celeb.job_title like '%영화배우%' AND celeb.agency='YG엔터테인먼트') OR
(age>=40 AND celeb.agency!='YG엔터테인먼트'));
괄호로 잘 구분하는 게 중요하다.
예제 3.
snl_show에 출연한 celeb 중,
에피소드 7, 9, 10 중에 출연했거나 소속사가 YG로 시작하고 뒤에 6글자로 끝나는 사람 중,
2020년 9월 15일 이후에 출연했던 사람을 검색:
select name, season, episode, broadcast_date, agency
from celeb, snl_show
where name=host AND
(episode in (7, 9, 10) OR agency like 'YG______') AND
broadcast_date > '2020-09-15';
예제 4.
snl_show에 출연한 celeb 테이블의 연예인 중,
영화배우나 텔런트가 아닌 연예인의
아이디, 이름, 직업, 시즌, 에피소드 정보를 검색:
select celeb.id, name, job_title, season, episode
from celeb, snl_show
where celeb.name = snl_show.host AND
not (job_title like '%영화배우%' or job_title like '%텔런트%');
예제 5.
snl_show에 출연한 celeb 중,
2020년 9월 15일 이후에 출연했거나 소속사 이름이 '엔터테인먼트'로 끝나지 않으면서
영화배우나 개그맨이 아닌 연예인의
아이디, 이름, 직업, 소속사를 검색:
select celeb.id, name, job_title, agency
from celeb, snl_show
where name=host AND
(broadcast_date > '2020-09-15' OR not agency like '%엔터테인먼트') AND
not (job_title like '%영화배우%' or job_title like '%개그맨%');