SQL 5일차 chapter9(~11)

박영선·2023년 5월 22일
0

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테이블을 풀아우터조인

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

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

profile
데이터분석 공부 시작했습니다

0개의 댓글