JOIN

eunbi kim·2024년 4월 2일
0
  • INNER JOIN
  • LEFT JOIN
  • RIGHT JOIN
  • FULL OUTER JOIN
  • SELF JOIN
  • SELF JOIN 예제

JOIN으로 테이블끼리 합쳐주는 실습을 위해
새로운 테이블과 데이터를 추가했당
그리고 이전시간까지 사용한 celeb 테이블을 사용할 것이다.

INNER JOIN

두 개의 테이블에서 "공통된 요소"들을 통해 결합하는 조인 방식. (교집합)

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까지 같이 써주면 좋다.

LEFT JOIN

두 개의 테이블에서 공통영역을 포함해 왼쪽 테이블의 다른 데이터(나머지 부분)도 포함하는 조인 방식.

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정보들도 가져와졌다.

RIGHT JOIN

두 개의 테이블에서 공통영역을 포함해 오른쪽 테이블의 다른 데이터(나머지 부분)도 포함하는 조인 방식.

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정보들도 가져와졌다.

FULL OUTER JOIN

두 개의 테이블에서 공통영역을 포함해 양쪽 테이블의 다른 영역들을 모두 포함하는 조인 방식. (합집합)

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테이블에만 있는 데이터들이
다 가져와졌다.

SELF JOIN

앞선 조인들보다 가장 많이 사용된다.
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;


SELF JOIN 예제

셀프조인 다양한 예제들로 살펴보기!

예제 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 '%개그맨%');

0개의 댓글