(SQL) Join

임경민·2023년 11월 6일
1
post-thumbnail

실습환경 만들기


  • celeb Table 사용

  • 새로운 Table 추가
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
);

  • 데이터 추가
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', '옥주현');

JOIN


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

JOIN 종류

  • INNER JOIN : 공통된 부분만 가져옴
  • FULL OUTER JOIN : 공통된 부분과 공통되지 않은 모든 부분을 가져옴

INNER JOIN


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

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

테이블을 2개 이상 사용하는 경우, column명 앞에 테이블을 작성해 구분할 수 있게 작성
table명.column명

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

LEFT JOIN


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

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

RIGHT JOIN


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

SELECT column1, column2, ...
FROM tableA
RIGHT JOIN tableB
ON tableA.column = tableB.column
WHERE condition;
  • Ex) 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;

FULL OUTER JOIN


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

SELECT column1, column2, ...
FROM tableA
FULL OUTER JOIN tableB
ON tableA.column = tableB.column
WHERE condition;
  • Ex) snl_show에 호스트로 출연한 celeb을 기준으로 celeb 테이블과 snl_show 테이블을 FULL OUTER JOIN
    • 아래의 문법을 사용 시, ERROR 발생
SELECT celeb.id, celeb.name, snl_show.id, snl_show.host
FROM celeb
FULL OUTER JOIN snl_show
ON celeb.name = snl_show.host;

MySQL에서는 FULL JOIN을 지원하지 않음
- 아래 쿼리로 같은 결과를 만들 수 있음

SELECT column1, column2, ...
FROM tableA
LEFT JOIN tableB ON .column .column
UNION
SELECT column1, column2, ...
FROM 
RIGHT JOIN .column
WHERE condition;
  • Ex) 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;

SELF JOIN


  • 가장 많이 사용되는 JOIN 방식
  • INNER JOIN과 같은 결과를 가져옴
SELECT column1, column2, ...
FROM tableA, tableB, ...
WHERE condition;
  • Ex) 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 celeb.job_title LIKE '%영화배우%' AND celeb.agency = 'YG엔터테이먼트') OR (celeb.age >= 40 AND celeb.agency != 'YG엔터테이먼트'));

  • 동일한 칼럼명이 존재하는 경우에만 테이블명 암시

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

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

  • Ex) snl_show에 출연한 celeb 중, 작년 9월 15일 이후에 출연했거나 소속사 이름이 ‘엔터테이먼트’로 끝나지 않으면서 영화배우나 개그맨이 아닌 연예인의 celeb 아이디, 이름, 직업, 소속사를 검색
SELECT celeb.id, celeb.name, celeb.job_title, celeb.agency
FROM celeb, snl_show
WHERE celeb.name = snl_show.host AND ((snl_show.broadcast_date > '2020-09-15' OR NOT celeb.agency LIKE '%엔터타이먼트') AND NOT (celeb.job_title LIKE '%영화배우%' OR celeb.job_title LIKE '%개그맨%'));

0개의 댓글