SQL - (Basic) JOIN 문법

jaam._.mini·2023년 12월 24일
0
post-thumbnail

퀴즈 봐야 하는데...강의가 한참 남았따..

  • 실습 환경 설정

    • 테이블 추가

      CREATE TABLE snl_show
      (
        ID int NOT NULL AUTO_INCREMENT PRIMARY KEY,
         # ID는 숫자형, null 값 허용하지 않음
         # AUTO_INCREMENT : 입력하지 않는 경우에는 자동으로 증가되는 값을 넣겠다
         # PRIMARY KEY : IDSMS NULL값을 가질수 없고, 중복도 허용되지 않는 조건
      
        SEASON int NOT NULL,
        EPISODE int NOT NULL,
        BROADCAST_DATE date,
        HOST varchar(32) NOT NULL
      );

    • 테이블 확인 (DESC snl_show;)

    • 데이터 추가

    • 데이터 확인

      SELECT * FROM snl_show;





JOIN

두개 이상의 테이블을 결합하는 것




(1) INNER JOIN


💡 기본 문법

SELECT column1, column2, ...
FROM tableA
INNER JOIN tableB

# 기준 (같은 경우에 JOIN 하겠다)
ON tableA.column = tableB.column

WHERE condition;

  • 예제 1.

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



(2) LEFT JOIN


💡 기본 문법

SELECT column1, column2, ...

# LEFT TABLE
FROM tableA 

# RIGHT TABLE
LEFT JOIN tableB 

# 기준 (같은 컬럼이 있는 경우에)
ON tableA.column = tableB.column

WHERE condition;

  • 예제 1.
    • 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;
    • snl_show 출연한 적이 없는 celeb은 NULL 값



(3) RIGHT JOIN


💡 기본 문법

SELECT column1, column2, ...

# LEFT TABLE
FROM tableA 

# RIGHT TABLE
RIGHT JOIN tableB 

# 기준 (같은 컬럼이 있는 경우에)
ON tableA.column = tableB.column

WHERE condition;

  • 예제 1.
    • 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;
    • 기존 celeb table에 없는 celeb은 NULL 값



(4) FULL OUTER JOIN

❗ MySQL에서 지원하지 않는 문법


💡 기본 문법
❗ MySQL에서 지원하지 않는 문법

SELECT column1, column2, ...

# LEFT TABLE
FROM tableA 

# RIGHT TABLE
FULL OUTER JOIN JOIN tableB 

# 기준 (같은 컬럼이 있는 경우에)
ON tableA.column = tableB.column

WHERE condition;


⭐ 비슷한 쿼리로 만들어줌

SELECT column1, column2, ...
FROM tableA
LEFT JOIN tableB ON tableA.column = tableB.column

UNION #중복 제거

SELECT column1, column2, ...
FROM tableA
RIGHT JOIN tableB ON tableA.column = tableB.column
WHERE condition;

  • 예제 1.

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





    • 비슷한 쿼리로 출력

      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;



(5) SELF JOIN

INNER JOIN과 결과값이 동일함


💡 기본 문법

SELECT column1, column2, ...

# table 이 여러개..!
FROM tableA, tableB

# 기준
WHERE condition;

  • 예제 1.

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

  • 예제 2.

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

      # 이름과 직업 검색
      SELECT celeb.name, celeb.job_title
      
      # JOIN 할 테이블
      FROM celeb, snl_show
      
      # 조건 1 (host로 출연한 적이 있는 셀럽)
      WHERE celeb.name = snl_show.host
      
      # 조건 2 (안테나 소속)
      AND celeb.agency = '안테나';
  • 예제 3.

    • celeb 테이블의 연예인 중
      snl_show 에 host로 출연했고
      영화배우는 아니면서 YG엔터 소속이거나
      40세 이상이면서 yg엔터 소속이 아닌
      연예인의 이름, 나이, 직업, 소속사, 시즌, 에피소드 검색

      • 1) celeb 테이블의 연예인 중 / 영화배우는 아니면서
        SELECT * FROM celeb
        WHERE NOT job_title LIKE '%영화배우%'
      • 2) YG엔터 소속이거나
        SELECT * FROM celeb
        WHERE NOT job_title LIKE '%영화배우%'
        AND agency = 'YG엔터'
      • 3) celeb 테이블의 연예인 중 / 40세 이상이면서 yg엔터 소속이 아닌
        SELECT * FROM celeb
        WHERE age>=40 AND agency != 'YG엔터'
      • 4) celeb 테이블의 연예인 중 / snl_show 에 host로 출연했고
        SELECT celeb.id, celeb.name, snl_show.host
        FROM celeb, snl_show
        WHERE celeb.name = snl_show.host
      • 4+1+2
        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엔터'
    • 최종 쿼리

    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엔터')
    );



  • 예제 4.

    • snl_show에 출연한 연예인의 snl_show 아이디, 시즌, 에피소드, 이름, 직업 정보 검색

      # 가져올 것듣
      SELECT snl_show.host, snl_show.season, snl_show.episode, celeb.name, celeb.job__title
      
      FROM celeb, snl_show
      
      WHERE celeb.name = snl_show.host

    • 컬럼명만 쓸 수 있는데,
      id는 두 table에 중복되어 있기 때문에 [에러]발생

    • 동일한 컬럼에 한해서 table을 써주면,
      컬럼명만 으로 쿼리를 쓸 수 있음



  • 예제 5.

    • snl_show에 출연한 celeb 중
      에피소드 7,9,10 중에 출연했거나
      소속사가 YG로 시작하고 뒤에 6글자로 끝나는 사람 중
      9/15일 이후 출연했던 사람을 검색
      SELECT name, seaeon, 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';


  • 예제 6.

    • snl_show에 출연한 celeb 테이블의 연예인 중
      영화배우 나 탈렌트가 아닌
      연예인의 아이디, 이름, 직업, 시즌, 에피소드 검색

      • me
        SELECT snl_show.id, name, job_title, season, episode
        FROM celeb, snl_show
        WHERE 
        NOT job_title='%영화배우%' 
        AND job_title='%탈렌트%'; 
        ▼ ❗정답❗
        SELECT celeb.id, name, job_title, season, episode
        FROM celeb, snl_show
        WHERE name = host
        AND
        NOT 
        (job_title LIKE ='%영화배우%' 
        OR job_title LIKE ='%탈렌트%'); 

제로베이스 데이터 스쿨
profile
비전공자의 데이터 공부법

0개의 댓글