[2023.11.28] SQL_JOIN

하은·2023년 11월 28일
0
post-custom-banner

- 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';
post-custom-banner

0개의 댓글