SQL 9 - join

민정윤·2024년 10월 7일
0

JOIN

실습을 위해 연예인 리스트가 적힌 celeb테이블과 snl 방송 정보가 적힌 snl_show라는 테이블 만들어놨음 (중복 데이터 유!)

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

join의 종류 살펴보기

  • inner join : 공통된 부분만 가져오기
  • full outer join : 공통된 부분과 공통되지 않은 부분 둘 다 가져오기
  • left join : 공통된 부분과 공통되지 않은 부분의 왼쪽 부분까지 가져오는 것
    (if null - 공통된 부분이 없다면 왼쪽 부분만 가져오기)
  • right join : 공통된 부분과 공통되지 않은 부분의 오른쪽 부분까지 가져오는 것

inner join

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

기본구조

SELECT col1, col2 ...
FROM tableA
INNER JOIN tableB
ON tableA.column = tableB.column
WHERE condition;

🚨 ON으로 join 기준 제공

  • 두 테이블의 컬럼이 같은 경우 join을 한다!

예제)

  • snl_show에 호스트로 출연한 celeb을 기준으로 celeb 을 기준으로 celeb테이블과 snl_show 테이블을 join해라

Inner join
host와 name을 비교해서 snl에 출연했던 celeb 정보만 조회

select celeb.id, celeb.name, snl_show.id, snl_show.host
from celeb
inner join snl_show
on celeb.name = snl_show.host;

👀 왼쪽이 celeb 테이블에서 가져온 것 오른쪽이 snl_show에서 가져온 것


left join

두 개의 테이블에서 공통영역을 포함해 왼쪽 테이블의 다른 데이터까지 포함하는 조인방식

기본구조

SELECT col1, col2 ...
FROM tableA
LEFT JOIN tableB
ON tableA.column = tableB.column
WHERE condition;

예제)

left join

  • snl_show에 출연한 적이 있는 celeb 정보와 출연하지 않은 celeb 정보 전부를 가져오는 것
  • 공통되지 않는 컬럼의 존재하지 않는 정보는 null로 표시
select celeb.id, celeb.name, snl_show.id, snl_show.host
from celeb
left join snl_show
on celeb.name = snl_show.host;


right join

두 개의 테이블에서 공통영역을 포함해 오른쪽 테이블의 다른 데이터까지 포함하는 조인방식

기본구조

SELECT col1, col2 ...
FROM tableA
RIGHT JOIN tableB
ON tableA.column = tableB.column
WHERE condition;

예제)

right join

  • host로 출연한 적이 있는 celeb과 snl 정보를 가져오고 celeb에 없는 snl_show 정보까지 가져오는 것
  • 공통되지 않는 컬럼의 존재하지 않는 정보는 null로 표시
select celeb.id, celeb.name, snl_show.id, snl_show.host
from celeb
right join snl_show
on celeb.name = snl_show.host;


full outer join

두 개의 테이블에서 공통영역을 포함해 양쪽 테이블의 모든 영역을 포함하는 조인방식

기본구조

SELECT col1, col2 ...
FROM tableA
FULL OUTER JOIN tableB
ON tableA.column = tableB.column
WHERE condition;

예제)

full outer join

BUT!!!

  • MySQL에서는 'full join'을 지원하지 않기 때문에 syntax error가 뜸
  • 그래서 Mysql에서는 이렇게 full outer 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

self join

한 테이블 내에서 데이터 간의 관계를 살쳐봐야 할 때 사용.
한 테이블에 존재하는 컬럼 사이에 의미있는 관계가 존재할 때 사용.

  • 기본구조
SELECT col1, col2 ...
FROM tableA, tableB
WHERE condition'
  • inner join과 같은 결과를 가지고 옴
  • 가지고 올 기준은 where 절에 넣어주면 됨

예제

self join
snl host로 출연한 적이 있는 celeb, 즉 교집합 데이터만 가져오는 것

select celeb.id, celeb.name, snl_show.id, snl_show.host
from celeb, snl_show
where  celeb.name = snl_show.host;

self-join 예제

01) celeb 테이블의 연예인 중, snl_show에 host로 출연했고 소속사가 안테나인 사람과 이름과 직업을 검색

select celeb.name, celeb.job_title
from celeb, snl_show
where celeb_name = snl_show.host AND celeb.agency = '안테나';

사람의 이름과 직업 먼저 가져오고 select
where에 두 테이블을 join할 기준 먼저 + 추가 조건

쿼리 복잡해지면 STEP BY STEP으로 하나씩 조건 만족해나가기


0개의 댓글