JOIN

JYJ·2022년 2월 22일
0

SQL / MySQL

목록 보기
9/25
post-thumbnail

JOIN

  • 여러개의 테이블을 일정한 조건에 의해 연결하여 마치 하나의 테이블처럼 만드는것 이다.


INNER JOIN

  • 결합하려는 테이블에서 공통된 요소들만을 뽑아 결합하는 조인 방식이다.

✔ 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;


LEFT JOIN

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

✔ 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;
-> JOIN하는 방향의 테이블(celeb)의 데이터는 그대로 남는다.


RIGHT JOIN

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

✔ snl_show에 호스트로 출연한 celeb을 기준으로 celeb테이블과 snl_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;
-> JOIN하는 방향의 테이블(snl_show)의 데이터는 그대로 남는다.


FULL OUTER JOIN

  • 2개의 테이블에서 공통영역을 포함하여 양쪽 테이블의 다른영역을 모두 포함하는 조인방식

✔ snl_show에 호스트로 출연한 celeb을 기준으로 celeb테이블과 snl_show테이블을 FULL OUTER JOIN

SELECT celeb.id, celeb.name, snl_show.id, snl_show.host
FROM celeb
FULL OUTER JOIN snl_show
ON celeb.name = snl_show.host;

하지만, MySQL에서는 FULL JOIN을 지원하지 않는다!
따라서 다음과 같은 방법으로 FULL OUTER JOIN과 같은 결과값을 나타낼 수 있다.

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;
-> LEFT JOIN 과 RIGHT JOIN을 동시에 사용함


SELF JOIN

  • JOIN 명령어를 따로 쓰지않고 조인시키는 방법

  • 나 자신과의 join이다.

  • FROM절에 같은 테이블이 2번 이상 등장하기 때문에 ALIAS가 반드시 필요하다.

  • 서로 다른 테이블끼리도 가능하다. (join할 테이블을 'FROM table1, table2' 로 쓰면 됨)

  • WHERE절에 조인할 조건을 넣으면 됨


✔ 자기자신과 조인

SELECT a.category_type, a.category_name,
	b.category_type, b.category_name
FROM category a, category b
WHERE a.category_name = b.parent_category
AND a.category_type = '대' ;


✔ 자기자신과 조인

SELECT a.category_type, a.category_name,
	b.category_type, b.category_name,
    c.category_type, c.category_name
FROM category a, category b, category c
WHERE a.category_name = b.parent_category
AND b.category_name = c.parent.category ;


✔ snl_show에 호스트로 출연한 celeb을 기준으로 celeb테이블과 snl_show테이블을 SELF JOIN

SELECT celeb.id, celeb.name, snl_show.id, snl_show.host
FROM celeb, snl_show
WHERE celeb.name = snl_show.host;


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

SELECT celeb.name, celeb.job_title
FROM celeb, snl_show
WHERE celeb.name = snl_show.host AND celeb.agency='안테나';


✔ celeb 테이블의 연예인중, snl_show에 host로 출연했고, 영화배우는 아니면서 YG엔터에이먼트 소속이거나 40세 이상이면서 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엔터테이먼트));
-> 괄호 위치 중요!


✔ 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';
-> 동일한 컬럼명이 존재하는 경우에 그 칼럼명 앞에 테이블명을 명시 해야한다




Non Equi 조인

  • 키 값으로 연결시 = 이 아닌 다른 연산자(BETWEEN, >, >=, <, <=)를 사용한다.




CROSS JOIN

  • 조건 컬럼없이 두 테이블 간 가능한 모든 연결을 결합하는 조인 방식이다.

  • 별도의 JOIN조건이 없는 경우 두 테이블은 Cartesian Product(카티션 곱)가 된다.




✔ JOIN이 아예 없을 때

SELECT A.col1, B.col3
FROM sample1 A, sample2 B
WHERE B.col3 % 5 = 0;


profile
Study note

0개의 댓글