[SQL] JOIN

허재훈·2023년 4월 26일
0

SQL

목록 보기
8/17
post-thumbnail

1. 실습환경 만들기

실습할 데이터베이스로 이동

  • zerobase 사용 (이동)
USE zerobase;

실습할 데이터 확인 - 1

SELECT * FROM celeb;

새로운 테이블 추가

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

추가한 테이블 정보 확인

DESC snl_show;

추가한 테이블에서 데이터 추가

INSERT INTO snl_show VALUES (1, 8, 7, '2020-09-05', '강동원');
INSERT INTO snl_show VALUES (2, 8, 8, '2020-09-12', '유재석');
INSERT INTO snl_show VALUES (3, 8, 9, '2020-09-19', '차승원');
INSERT INTO snl_show VALUES (4, 8, 10, '2020-09-26', '이수현');
INSERT INTO snl_show VALUES (5, 9, 1, '2021-09-04', '이병헌');
INSERT INTO snl_show VALUES (6, 9, 2, '2021-09-11', '하지원');
INSERT INTO snl_show VALUES (7, 9, 3, '2021-09-18', '제시');
INSERT INTO snl_show VALUES (8, 9, 4, '2021-09-25', '조정석');
INSERT INTO snl_show VALUES (9, 9, 5, '2021-10-02', '조여정');
INSERT INTO snl_show VALUES (10, 9, 6, '2021-10-09', '옥주현');

추가한 테이블의 데이터 확인

SELECT * FROM snl_show;

2. JOIN

JOIN 기본

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

두개의 실습 테이블 확인

3. INNER JOIN

  • 두 개의 테이블에서 공통된 요소들을 통해 결합하는 조인방식

INNER JOIN 문법

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

INNER JOIN 예제 - 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;

4. LEFT JOIN

  • 두개의 테이블에서 공통영역을 포함해 왼쪽 테이블의 다른 데이터를 포함하는 조인방식

LEFT JOIN 문법

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

LEFT JOIN 예제 - 1

SELECT celeb.id, celeb.name, snl_show.id, snl_show.host
FROM celeb
LEFT JOIN snl_show
ON celeb.name = snl_show.host;

5. RIGHT JOIN

  • 두개의 테이블에서 공통영역을 포함해 오른쪽 테이블의 다른 데이터를 포함하는 조인방식

RIGHT JOIN 문법

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

RIGHT JOIN 예제

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

6. FULL OUTER JOIN

  • 두개의 테이블에서 공통영역을 포함하여 양쪽 테이블의 다른영역을 모두 포함하는 조인방식

FULL OUTER JOIN 문법 - SQL

SELECT column1, column2, ... 
FROM tableA
FULL OUTER JOIN talbeB
ON tableA.column = tableB.column
WHERE condition;

FULL OUTER JOIN 예제 - SQL

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

FULL OUTER JOIN 문법 - MySQL

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

FULL OUTER JOIN 예제 - MySQL

  • snl_show 에 호스트로 출연한 celeb 을 기준으로
    celeb 테이블과 snl_show 테이블을 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
UNOIN
SELECT celeb.id, celeb.name, snl_show.id, snl_show.host
FROM celeb
RIGHT JOIN snl_show
ON celeb.name = snl_show.host;

7. SELF JOIN

SELF JOIN 문법

SELECT column1, column2, ... 
FROM tableA, talbeB, ...
WHERE condition;

SELF JOIN 예제 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;

SELF JOIN 예제 2

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

SELF JOIN 예제 2-1

  • celeb 테이블의 연예인 중 ㅡ 소속사가 안테나인 사람의 이름과 직업
SELECT name, job_title
FROM celeb
WHERE agency = '안테나';

SELF JOIN 예제 2-2

  • celeb 테이블의 연예인 중, snl_show 에 host 로 출연했고
SELECT celeb.name, snl_show.host
FROM celeb, snl_show
WHERE celeb.name = snl_show.host; 

SELF JOIN 예제 2-3

  • celeb 테이블의 연예인 중, snl_show 에 host 로 출연했고 소속사가 안테나인 사람의 이름과 직업을 검색
SELECT celeb.name, celeb.job_title
FROM celeb, snl_show
WHERE celeb.name = snl_show.host AND celeb.agency = '안테나'; 

SELF JOIN 예제 3

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

SELF JOIN 예제 3-1

  • celeb 테이블의 연예인 중, 영화배우는 아니면서
SELECT *
FROM celeb
WHERE NOT job_title LIKE '%영화배우%'; 

SELF JOIN 예제 3-2

  • celeb 테이블의 연예인 중, 영화배우는 아니면서 YG 엔터테이먼트 소속
SELECT *
FROM celeb
WHERE NOT job_title LIKE '%영화배우%' AND agency = 'YG엔터테인먼트'; 

SELF JOIN 예제 3-3

  • celeb 테이블의 연예인 중, 40세 이상
SELECT *
FROM celeb
WHERE age >= 40; 

SELF JOIN 예제 3-4

  • celeb 테이블의 연예인 중, 40세 이상이면서 YG 엔터테이먼트 소속이 아닌
SELECT *
FROM celeb
WHERE age >= 40 AND agency != 'YG엔터테인먼트'; 

SELF JOIN 예제 3-5

  • celeb 테이블의 연예인 중, snl_show 에 host 로 출연했고,
SELECT celeb.id, celeb.name, snl_show.host
FROM celeb, snl_show
WHERE celeb.name = snl_show.host; 

SELF JOIN 예제 3-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엔터테인먼트';

SELF JOIN 예제 3-7

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엔터테인먼트';

SELF JOIN 예제 3-8

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엔터테인먼트'));

SELF JOIN 예제 4

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

SELF JOIN 예제 4-1

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

SELF JOIN 예제 4-2

  • CASE 2. 칼럼명만 명시 (에러 - 동일한 칼럼명인 경우)
SELECT id, season, episode, name, job_title
FROM celeb, snl_show
WHERE name = host;

SELF JOIN 예제 4-3

  • CASE 3. 동일한 칼럼명이 존재하는 경우에만 테이블명을 암시
SELECT snl_show.id, season, episode, name, job_title
FROM celeb, snl_show
WHERE name = host;

SELF JOIN 예제 5

  • snl_show 에 출연한 celeb 중, 에피소드 7, 9, 10 중에 출연했거나
    소속사가 YG로 시작하고 뒤에 6글자로 끝나는 사람 중 작년 9월15일 이후에 출연했던 사람을 검색

SELF JOIN 예제 5-1

  • snl_show 에 출연한 celeb
SELECT name, season, episode, broadcast_date, agency
FROM celeb, snl_show
WHERE name = host;

SELF JOIN 예제 5-2

  • snl_show 에 출연한 celeb 중, 에피소드 7, 9, 10 중에 출연
SELECT name, season, episode, broadcast_date, agency
FROM celeb, snl_show
WHERE name = host AND episode IN (7, 9, 10);

SELF JOIN 예제 5-3

  • snl_show 에 출연한 celeb 중, 소속사가 YG로 시작하고 뒤에 6글자로 끝나는 사람
SELECT name, season, episode, broadcast_date, agency
FROM celeb, snl_show
WHERE name = host AND agency LIKE 'YG______';

SELF JOIN 예제 5-4

SELECT name, season, episode, broadcast_date, agency
FROM celeb, snl_show
WHERE name = host AND episode IN (7, 9, 10) OR agency LIKE 'YG______';

SELF JOIN 예제 5-5

  • 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______');

SELF JOIN 예제 5-6

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

SELF JOIN 예제 5-7

  • snl_show 에 출연한 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';


위 글은 제로베이스 데이터 취업 스쿨의 강의자료를 참고하여 작성되었습니다.

profile
허재

0개의 댓글