[제로베이스]SQL_08. Join

새봄·2024년 1월 21일
post-thumbnail

1. Join

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

2. INNER JOIN(교집합)

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

1) INNER JOIN 문법

SELECT COLUMN1, COLUMN2, ...
FROM TableA
INNER JOIN TableB
ON TableA.COLUMN = TableB.COLUMN
WHERE CONDITION;

2) INNER JOIN 예제

(1) 예제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;

3. LEFT JOIN

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

1) LEFT JOIN 문법

SELECT COLUMN1, COLUMN2, ..
FROM tableA
LEFT JOIN tableB
ON tableA.COLUMN = tableB.COLUMN
WHERE condition;

2) LEFT JOIN 예제

(1) 예제1

  • LEFT JOIN 결과, 출연하지 않은 CELEB 테이블의 결과도 같이 불러온다.
SELECT CELEB.ID, CELEB.NAME, SNL_SHOW.ID, SNL_SHOW.HOST
FROM CELEB
LEFT JOIN SNL_SHOW
ON CELEB.NAME = SNL_SHOW.HOST;

4. RIGHT JOIN

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

1) RIGHT JOIN 문법

SELECT COLUMN1, COLUMN2, ..
FROM tableA
RIGHT JOIN tableB
ON tableA.COLUMN = tableB.COLUMN
WHERE condition;

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

5. FULL OUTER JOIN

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

1) FULL OUTER JOIN 문법

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

2) 예제

  • snl_show 에 호스트로 출연한 celeb을 기준으로 celeb 테이블과 snl_show 테이블을 FULL OUTER JOIN
  • FULL OUTER JOIN은 MYSQL에서는 지원하지 않기 때문에 에러가 난다. 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_host;

3) MySQL FULL OUTER JOIN 문법

  • MySQL에서는 FULL JOIN을 지원하지 않으므로 다음의 쿼리로 같은 결과를 만들 수 있다.
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;

4) 예제

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

6. SELF JOIN

1) SELF JOIN 문법

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

2) 예제

(1) 예제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) 예제2. celeb 테이블의 연예인 중, snl_show에 host로 출연했고 소속사가 안테나인 사람의 이름과 직업을 검색

SELECT celeb.name, celeb.job_title
FROM celeb, snl_show
WHERE celeb.name = snl_show.host and  celeb.agency = '안테나';

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

SELECT celeb.name, 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 NOT AGENCY = 'YG엔터테이먼트'));

  • 다른 줄에 적히면 에러 발생

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

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;

  • 컬럼명이 다를 경우 따로 적지 않아도 괜찮으나, 동일한 컬럼명이 있다면 에러 발생

  • 동일한 컬럼명이 존재하는 경우에만 테이블명 기입

(5) 예제5. snl_show 에 출연한 celeb 중, 에피소드 7, 9 , 중에 출연했거나 소속사가 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 = 'YG______') AND broadcast_date > '2023-09-15';

0개의 댓글