JOIN

JERRY·2025년 2월 28일

SQL

목록 보기
9/18
post-thumbnail

1. 실습환경 만들기

  • 실습할 데이터베이스로 이동 : zerobase 사용(이동)
USE zerobase;

  • 실습할 데이터 확인
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 기본 : 두 개 이상의 테이블을 결합하는 것

  • 두개의 실습 테이블 확인

2-1 INNER JOIN

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

  • INNER JOIN 문법

SELECT column1, column2, ...
FROM tableA
INNER JOIN tableB
ON tableA.column = tableB.column
WHERE condition;
  • INNER JOIN 예제 : 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-2 LEFT JOIN

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

  • LEFT JOIN 문법

SELECT column1, column2, ...
FROM tableA
LEFT JOIN tableB
ON tableA.column = tableB.column
WHERE condition;
  • LEFT JOIN 예제 : 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;

2-3 RIGHT JOIN

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

  • RIGHT JOIN 문법

SELECT column1, column2, ...
FROM tableA
RIGHT JOIN tableB
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;

2-4 FULL OUTER JOIN

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

  • FULL OUTER JOIN 문법

SELECT column1, column2, ...
FROM tableA
FULL OUTER JOIN tableB
ON tableA.column = tableB.column
WHERE condition;
  • FULL OUTER JOIN 예제 : 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;

SQL 에서는 FULL JOIN 을 지원하지 않으므로 다음의 쿼리로 같은 결과를 만들 수 있다.

  • FULL OUTER JOIN 문법 (MySQL)
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;
  • 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
UNION
SELECT celeb.id, celeb.name, snl_show.id, snl_show.host
FROM celeb
RIGHT JOIN snl_show
ON celeb.name = snl_show.host;

2-5 SELF JOIN

  • SELF JOIN 문법
SELECT column1, column2, ...
FROM tableA, tableB, ...
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로 출연했고 소속사가 안테나인 사람의 이름과 직업을 검색
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 엔터테이먼트 소속이 아닌 연예인의 이름과 나이, 직업, 소속사, 시즌, 에피소드 정보를 검색
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 아이디, 시즌, 에피소드, 이름, 직업 정보를 검색
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일 이후에 출연했던 사람을 검색
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';

0개의 댓글