- JOIN
- JOIN 기본
- INNER JOIN : A와 B의 공통된 부분(교집합)
- FULL OUTER JOIN : A와 B의 모든 부분(합집합)
- LEFT JOIN : A만
- RIGHT JOIN : B만
- INNER JOIN
두개의 테이블에서 공통된 요소들을 통해 결합하는 조인방식
- INNER JOIN 문법
SELECT column1, column2, ...
FROM table A
INNER JOIN table B
ON tableA.column = tableB.column 기준을 주고, 같을 때만
WHERE condition;
- 예) snl_show에 호스트로 출연한 celeb을 기준으로 celeb 테이블과 snl_show 테이블을 INNER JOIN 해보자
:
SELECT celeb.id, celeb.name, snl_show.id, snl_shol.host
FROM celeb
INNER JOIN snl_show
ON celeb.name = snl_show.host;
- LEFT JOIN
두 개의 테이블에서 공통영역을 포함해 왼쪽 테이블의 다른 데이터를 포함하는 조인방식
- LEFT JOIN 문법
SELECT column1, column2, ...
FROM table A #LEFT
LEFT JOIN table B #RIGHT
ON tableA.column = tableB.column
WHERE condition;
- 예)
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
두 개의 테이블에서 공통영역을 포함해 오른쪽 테이블의 다른 데이터를 포함하는 조인방식
- RIGHT JOIN 문법
SELECT column1, column2, ...
FROM table A
RIGHT JOIN table B
ON tableA.column = tableB.column
WHERE condition;
- 예
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에 출연한 사람의 정보+ celeb에 없으면서 snl에 출연한 사람의 null 정보
- FULL OUTER JOIN
두 개의 테이블에서 공통영역을 포함해 양쪽 테이블의 다른 데이터를 모두 포함하는 조인방식
- FULL OUTER JOIN 문법
SELECT column1, column2, ...
FROM table A
FULL OUTER JOIN table B
ON tableA.column = tableB.column
WHERE condition;
- 예
SELECT celeb.id, celeb.name, snl_show.id, snl_show.host
FROM celeb
FULL OUTER JOIN snl_show
ON celeb.name = snl_show.host;
= 오류가 남
= MY SQL 에서는 지원하지 않음
- FULL OUTER JOIN문법 - MySQL의 경우
MySQL에서는 FULL OUTER JOIN을 지원하지 않으므로 다음의 쿼리로 같은 결과를 만들 수 있다
SELECT column1, column2, ...
FROM table A
LEFT JOIN table B
ON tableA.column = tableB.column
*UNION
SELECT column1, column2, ...
FROM table A
RIGHT JOIN table B
ON tableA.column = tableB.column
WHERE condition;
- 예)
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
앞선 JOIN보다 가장 많이 사용되는 방법
문법은 다르지만 INNER JOIN과 같은 효과(공통된 데이터 가져옴)
SELECT column1, column2, ...
FROM tableA, tableB, ...
WHERE condition;
- 예) 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로 출연했고, 소속사가 안테나인 사람의 이름과 직업을 검색
-
1) celeb 테이블의 연예인 중, 소속사가 안테나인 사람의 이름과 직업을 검색
:
SELECT name, job_title
FROM celeb
WHERE agency = '안테나'
-
2) celeb 테이블의 연예인 중, snl_show에 host로 출연한 사람
:
SELECT celeb.name, snl_show.host
FROM celeb, snl_show
WHERE celeb.name = snl_show.host;
-
3) 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 테이블의 연예인 중, snl_show에 host로 출연했고, 영화배우는 아니면서 YG 엔터테인먼트 소속이거나 40세 이상이면서 YG엔터테인먼트 소속이 아닌 연예인의 이름과 나이, 직업, 소속사, 시즌, 에피소드 정보 검색
- 1) celeb 테이블의 연예인 중, 영화배우는 아니면서
SELECT * FROM celeb
WHERE NOT job_title LIKE '%영화배우%';
- 2) celeb 테이블의 연예인 중, 영화배우는 아니면서 YG 엔터테인먼트 소속이거나
SELECT * FROM celeb
WHERE NOT job_title LIKE '%영화배우%' AND agency = 'YG엔터테인먼트'
- 3) celeb 테이블의 연예인 중, 40세 이상이면서
SELECT * FROM celeb
WHERE age >= 40;
- 4) celeb 테이블의 연예인 중, 40세 이상이면서 YG엔터테인먼트 소속이 아닌
SELECT * FROM celeb
WHERE age >= 40 AND agency != 'YG엔터테인먼트';
- 5) celeb 테이블의 연예인 중, snl_show에 host로 출연했고,
SELECT celeb.id, celeb.name, snl_show.host
FROM celeb, snl_show
WHERE celeb.name = snl_show.host;
- 6) 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엔터테인먼트';
- 7) celeb 테이블의 연예인 중, snl_show에 host로 출연했고, 영화배우는 아니면서 YG 엔터테인먼트 소속이거나 40세 이상이면서 YG엔터테인먼트 소속이 아닌 연예인의 이름과 나이, 직업, 소속사, 시즌, 에피소드 정보 검색
= ( )로 안 묶어주면 오류가 남
SELECT celeb.id, celeb.name, celeb.job_title, celeb.agency, snl_show.host, 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엔터테인먼트'));
예제3) snl_show에 출연한 연예인의 snl_show 아이디, 시즌, 에피소드, 이름, 직업정보를 검색
- 방법 1) 칼럼명 앞에 테이블 명을 명시
SELECT snl_show.id, snl_show.season, snl_show.episode, celeb.name, celeb.job_title
FROM celeb, snl_show
WHERE celeb.name = snl_show.host;
- 방법 2) 동일한 칼럼명이 존재하는 경우에만 테이블 명을 암시
SELECT snl_show.id, season, episode, name, job_title
FROM celeb, snl_show
WHERE name = host;
예제4) snl_show에 출연한 celeb 중, 에피소드 7, 9, 10 중에 출연했거나, 소속사가 YG로 시작하고 뒤에 6글자로 끝나는 사람 중 작년 9월 15일 이후에 출연했던 사람을 검색
- 1) snl_show에 출연한 celeb 중
SELECT name, season, episode, broadcast_date, agency
FROM celeb, snl_show
WHERE name = host;
- 2) snl_show에 출연한 celeb 중, 에피소드 7, 9, 10 중에 출연했거나(목록에 소속되는 in사용)
SELECT name, season, episode, broadcast_date, agency
FROM celeb, snl_show
WHERE name = host AND episode IN (7, 9, 10);
- 3) snl_show에 출연한 celeb 중, 소속사가 YG로 시작하고 뒤에 6글자로 끝나는 사람
SELECT name, season, episode, broadcast_date, agency
FROM celeb, snl_show
WHERE name = host AND agency Like 'YG__' ; (언더바 6개)
- 4) snl_show에 출연한 celeb 중, 에피소드 7, 9, 10 중에 출연했거나, 소속사가 YG로 시작하고 뒤에 6글자로 끝나는 사람
SELECT name, season, episode, broadcast_date, agency
FROM celeb, snl_show
WHERE name = host AND (episode IN (7, 9, 10) OR agency Like 'YG__') ;
- 5) snl_show에 출연한 celeb 중, 작년 9월 15일 이후에 출연했던 사람을 검색
SELECT name, season, episode, broadcast_date, agency
FROM celeb, snl_show
WHERE name = host AND broadcast_date > '2020-09-15';
- 6) snl_show에 출연한 celeb 중, 에피소드 7, 9, 10 중에 출연했거나, 소속사가 YG로 시작하고 뒤에 6글자로 끝나는 사람 중 작년 9월 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';