SQL 기초12 - 07~11 - SELF JOIN_(Chapter 09. JOIN)

HA_·2023년 11월 28일
0

Chapter 09-7. SELF JOIN

1. SELF JOIN 문법

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

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


3. SELF JOIN 예제 - 2

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

SELECT CELEB.ID, CELEB.NAME, SNL_SHOW.ID, SNL_SHOW.HOST
FROM CELEB, SNL_SHOW
WHERE CELEB.NAME = SNL_SHOW.HOST
AND CELEB.AGENCY LIKE '%안테나%';

오답!
풀이)

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

STEP 1.

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

SELECT name, job_title
FROM celeb
WHERE agency = '안테나';

STEP 2.

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

SELECT celeb.name, snl_show.host
FROM celeb, snl_show
WHERE celeb.name = snl_show.host;

STEP 3.

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

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

4. SELF JOIN 예제 - 3

celeb 테이블의 연예인 중, snlshow 에 host 로 출연했고, 영화배우는 아니면서 YG 엔터테이먼트 소속이거나 40세 이상이면서 YG 엔터테이먼트 소속이 아닌 연예인의 이름과 나이, 직업, 소속사, 시즌, 에피소드 정보를 검색
![](https://velog.velcdn.com/images/ha
/post/226c1c51-346a-4b52-a9e3-31f23c9ea7b6/image.png)
내가 적은 답)

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 (CELEB.JOB_TITLE != '영화배우' AND CELEB.AGENCY = 'YG엔터테이먼트')
OR (CELEB.AGE >= 40 AND CELEB.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엔터테이먼트'));

STEP 1.

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

SELECT * FROM celeb
WHERE NOT job_title LIKE '영화배우%';

STEP 2.

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

SELECT * FROM celeb
WHERE NOT job_title LIKE '영화배우%' AND agency = 'YG엔터테이먼트';

STEP 3.

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

SELECT * FROM celeb
WHERE age >= 40;

STEP 4.

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

SELECT * FROM celeb
WHERE age >= 40 AND agency != '%YG엔터테이먼트';

STEP 5.

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

SELECT celeb.id, celeb.name, snl_show.host
FROM celeb, snl_show
WHERE celeb.name = snl_show.host;

STEP 6.

celeb 테이블의 연예인 중, snl_show 에 host 로 출연했고, 영화배우는 아니면서 YG 엔터테이먼트 소속이거나 40세 이상이면서 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엔터테이먼트';

STEP 7.

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

  • 연산 순서를 제대로 묶어주지 않아 오류가 남!
  • 연산 모양을 잘 잡아줘야 됨!!

STEP 8.

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

5. SELF JOIN 예제 - 4

snlshow 에 출연한 연예인의 snl_show 아이디, 시즌, 에피소드, 이름, 직업 정보를 검색
![](https://velog.velcdn.com/images/ha
/post/5b38f44c-4f15-4e04-8def-739b1216dc4b/image.png)
내가 적은 답)

SELECT SNL_SHOW.ID, SNL_SHOW.SEASON, SNL_SHOW.EPISODE, SNL_SHOW.HOST, CELEB.JOB_TITLE
FROM CELEB, SNL_SHOW
WHERE CELEB.NAME = SNL_SHOW.HOST;


정답?
풀이)

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;

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;

CASE 2. 칼럼명만 명시 (에러 - 동일한 칼럼명인 경우)

  • cf) 칼럼명만 명시할 경우 에러가 난다. 두 테이블에 모두 'ID'라는 칼럼이 있기 때문!
SELECT id, season, episode, name, job_title
FROM celeb, snl_show
WHERE name = host;

CASE 3. 동일한 칼럼명이 존재하는 경우에만 테이블명을 암시

  • 이걸 해결하기 위 'ID' 칼럼에는 테이블명을 명시해야 함!
SELECT snl_show.id, season, episode, name, job_title
FROM celeb, snl_show
WHERE name = host;

6. SELF JOIN 예제 - 5

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

내가 적은 답)

SELECT CELEB.NAME, CELEB.AGENCY, SNL_SHOW.EPISODE, SNL_SHOW.BROADCAST_DATE
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');


정답! -> 강의교안에는 'SEASON'칼럼에 대한 언급은 없기 때문에 SELECT절에 넣지 않았음.
풀이)

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

STEP 1.

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

SELECT name, season, episode, broadcast_date, agency
FROM celeb, snl_show
WHERE name = host;

STEP 2.

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

STEP 3.

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 agency like 'YG______';

STEP 4.

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

  • 연산하는 순서를 제대로 안묶어줘서 이상하게 나옴!

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

STEP 6.

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 broadcast_date > '2020-09-15';

STEP 6.

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

혼자서 해봅시다.

문제 1. snl_show 에 출연한 celeb 테이블의 연예인 중, 영화배우나 텔런트가 아닌 연예인의 아이디, 이름, 직업, 시즌, 에피소드 정보를 검색하세요.


내가 쓴 답)

SELECT CELEB.ID, CELEB.JOB_TITLE, SNL_SHOW.SEASON, SNL_SHOW.EPISODE
FROM CELEB, SNL_SHOW
WHERE CELEB.NAME = SNL_SHOW.HOST
AND (JOB_TITLE NOT LIKE '%영화배우%' OR JOB_TITLE NOT LIKE '%텔런트%');


오답!
풀이)

SELECT CELEB.ID, NAME, JOB_TITLE, SEASON, EPISODE
FROM CELEB, SNL_SHOW
WHERE NAME = HOST
AND NOT (JOB_TITLE LIKE '%영화배우%' OR JOB_TITLE LIKE '%텔런트%');

  • NOT의 위치가 잘못됨! => 'NOT 칼럼명 LIKE 조건'
  • 'NAME' 칼럼이 빠짐!

문제 2. snl_show 에 출연한 celeb 중, 작년 9월 15일 이후에 출연했거나 소속사 이름이 ‘엔터테이먼트’ 로 끝나지 않으면서 영화배우나 개그맨이 아닌 연예인의 celeb 아이디, 이름, 직업, 소속사를 검색하세요.


내가 쓴 답)

SELECT CELEB.ID, NAME, JOB_TITLE, AGENCY
FROM CELEB, SNL_SHOW
WHERE NAME = HOST
AND (BROADCAST_DATE >= '2020-09-15' OR NOT AGENCY LIKE '%엔터테이먼트')
AND  NOT (JOB_TITLE LIKE '%영화배우%' OR JOB_TITLE LIKE '%개그맨%');


정답!
풀이)

    1. snl_show 에 출연한 celeb 중, 작년 9월 15일 이후에 출연했거나 소속사 이름이 ‘엔터테이먼트’ 로 끝나지 않으면서 영화배우나 개그맨이 아닌 연예인의 celeb 아이디, 이름, 직업, 소속사를 검색하세요.
SELECT CELEB.ID, NAME, JOB_TITLE, AGENCY
FROM CELEB, SNL_SHOW
WHERE CELEB.NAME = SNL_SHOW.HOST;

    1. snl_show 에 출연한 celeb 중, 작년 9월 15일 이후에 출연했거나 소속사 이름이 ‘엔터테이먼트’ 로 끝나지 않으면서 영화배우나 개그맨이 아닌 연예인의 celeb 아이디, 이름, 직업, 소속사를 검색하세요.
SELECT CELEB.ID, NAME, JOB_TITLE, AGENCY
FROM CELEB, SNL_SHOW
WHERE CELEB.NAME = SNL_SHOW.HOST
AND BROADCAST_DATE >= '2020-09-15';

    1. snl_show 에 출연한 celeb 중, 작년 9월 15일 이후에 출연했거나 소속사 이름이 ‘엔터테이먼트’ 로 끝나지 않으면서 영화배우나 개그맨이 아닌 연예인의 celeb 아이디, 이름, 직업, 소속사를 검색하세요.
SELECT CELEB.ID, NAME, JOB_TITLE, AGENCY
FROM CELEB, SNL_SHOW
WHERE CELEB.NAME = SNL_SHOW.HOST
AND (BROADCAST_DATE >= '2020-09-15'
OR NOT AGENCY LIKE '%엔터테이먼트');

    1. snl_show 에 출연한 celeb 중, 작년 9월 15일 이후에 출연했거나 소속사 이름이 ‘엔터테이먼트’ 로 끝나지 않으면서 영화배우나 개그맨이 아닌 연예인의 celeb 아이디, 이름, 직업, 소속사를 검색하세요.
SELECT  CELEB.ID, NAME, JOB_TITLE, AGENCY
FROM CELEB, SNL_SHOW
WHERE NAME = HOST
AND NOT (JOB_TITLE LIKE '%영화배우%' OR JOB_TITLE LIKE '%개그맨%');

    1. 결론
      snl_show 에 출연한 celeb 중, 작년 9월 15일 이후에 출연했거나 소속사 이름이 ‘엔터테이먼트’ 로 끝나지 않으면서 영화배우나 개그맨이 아닌 연예인의 celeb 아이디, 이름, 직업, 소속사를 검색하세요.
SELECT CELEB.ID, NAME, JOB_TITLE, AGENCY
FROM CELEB, SNL_SHOW
WHERE NAME = HOST
AND (BROADCAST_DATE > '2020-09-15' OR NOT AGENCY LIKE '%엔터테이먼트')
AND NOT (JOB_TITLE LIKE '%영화배우%' OR JOB_TITLE LIKE '%개그맨%');

  • 이후라서 9월 15일 포함하지 않아야 함!!
  • cf) 정확한 디렉팅을 준 것이 아니라 사람마다 이해한 테이블이 다름!

0개의 댓글