JOIN
실습환경 만들기
새로운 테이블 추가
mysql> create table snl_show
-> (
-> ID int Not null auto_increment primary key,
-> season int not null,
-> episode int not null,
-> broadcast_date date,
-> host varchar(32) not null
-> );
Query OK, 0 rows affected (0.03 sec)
(오토인크리먼트 = 입력 안하면 자동으로 증가된 값을 넣겠다.)
데이터 추가
JOIN : 두개 이상의 테이블을 결합하는것 (수평결합 / 유니온은 수직결합)
이너 : 공통된거
풀아우터 : 전체
레프트 : 공통 + 왼쪽
라이트 : 공통 + 오른쪽
INNER JOIN
select 컬럼 from 테이블A inner join 테이블B on 테이블A.컬럼 = 테이블B.컬럼
where 조건;
snl show에 호스트로 출연한 celeb기준으로 두 테이블을 이너조인
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
select 컬럼 from 테이블A left join 테이블B on 테이블A.컬럼 = 테이블B.컬럼
where 조건;
snl show 호스트 출연 celeb 기준으로 celeb테이블과 snl_show 테이블 레프트 조인
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 컬럼 from 테이블A right join 테이블B on 테이블A.컬럼 = 테이블B.컬럼
where 조건;
snl show 호스트 출연 celeb 기준으로 celeb테이블과 snl_show 테이블 라이트 조인
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 컬럼 from 테이블A full outer join 테이블B on 테이블A.컬럼 = 테이블B.컬럼
where 조건;
snl_show에 호스트로 출연한 celeb을 기준으로 celeb 테이블과 snl테이블을 풀아우터조인
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 컬럼 from 테이블A, 테이블B where 조건;
이것만 보면 그냥 셀렉트 같음. 조건에서 각 테이블의 컬럼 조건을 추가
snl에 호스트 출연한 celeb 기준으로 두 테이블을 셀프조인
select celeb.id, celeb.name, snl_show.id, snl_show.host
-> from celeb, snl_show
-> where celeb.name = snl_show.host;
celeb 연예인 중, snl show 호스트로 출연했고, 소속사가 안테나인 사람의 이름과 직업
select celeb.name, celeb.job_title
-> from celeb, snl_show
-> where celeb.name = snl_show.host and celeb.agency = '안테나';
celeb 테이블의 연예인 중 snlshow 호스트 출연했고 / 영화배우는 아니면서 YG 소속이거나/
40세 이상이면서 YG 소속이 아닌 연예인의 이름,나이,직업,소속사,시즌,에피소드 정보 검색
select celeb.name, celeb.age, celeb.agency, snl_show.season, snl_show.episode
-> from celeb, snl_show
-> where celeb.name = snl_show.host # celeb 중 SNL 출연했고
-> and((not job_title like '%영화배우%' and agency = 'YG엔터테인먼트') or
-> (age >= 40 and agency != 'YG엔터테인먼트')); (나머지 조건)
snl 출연 연예인의 아이디, 시즌, 에피소드, 이름 직업 정보 검색
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;
snl 시즌 9에 출연한 celeb중 / 에피 7,9,10 중 출연했거나 / 소속사 YG,뒤 6자리로 끝나는 사람 중 작년 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';
snl 출연 celeb 테이블 연예인 중 /영화배우나 탤런트가 아닌 연예인의 아이디, 이름, 직업, 시즌, 에피소드
select celeb.id, name, job_title, season, episode
-> from celeb, snl_show
-> where name = host
-> and (not job_title like '%영화배우%' and not job_title like '%탤런트%');
not (job_title like '%영화배우%' or job_title like '%탤런트%') 도 동일
snl 출연 celeb 중 / 작년 9/15 이후 출연했거나 / 소속사 이름이 엔터테인먼트 로 끝나지 않으면서 영화배우나 개그맨이 아닌 연예인/ 의 celeb 아이디, 이름, 직업, 소속사
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 '%개그맨%');