본문 바로가기
> 프로그래밍 언어/SQL

[SQL 데이터 분석, 활용!] 섹션 4. 테이블 조인

by 자몽주스 2023. 2. 14.
728x90
반응형

[개념은 호옹~, 실습 빡]

SQL 데이터 분석, 활용!

참고사이트:

SQL, 데이터 분석! | CloudStudying

테이블 조인(feat. 인스타그램)
테이블 조인 개요

테이블 JOIN 이 쓰이는 상황:

인스타 댓글에

사용자 닉넴과 댓글이 함께 나오는데

 각각의 테이블로 나눠진 데이터

함께 보여주려고 할 때

JOIN을 사용한다

 

- JOIN 종류 (2)

INNER JOIN

OUTER JOIN

 

- OUTER JOIN (3)

LEFT

RIGHT

FULL

- 댓글사용자 정보를 합쳐주는 예시 -

FROM 절에서 댓글을 가져온 뒤

JOIN으로 사용자 레코드를 (USERS)

앞서 갖고 온 COMMENTS 에 붙여준다

 

FROM 절의 데이터와

JOIN 절의 데이터를 연결하는 것인데

JOIN 조건을  기준으로 연결한다

INNER JOIN:

두 테이블 데이터(정보)를

하나로 합쳐서 갖고오는 것

테이블 조인 실습 준비

이전에 사용한

DB 삭제 하기

INNER 조인 #1 (댓글내용과 작성자 닉네임 조회)

댓글내용과 닉네임이

서로 다른 테이블에 저장돼있음

 

댓글 - COMMENTS

닉네임 - USERS

SELECT - 갖고올 것

FROM -   COMMENTS 에서 갖고 올 것

JOIN - USERS 를 붙일 것임

ON - 조건

붙일 때 USERS의 아이디가

COMMENTS의 유저_아이디랑 같아야 함

조건의 이유:

매칭이 이렇게 연결되기 때문.

사용자의 아이디 - 댓글단 사람의 아이디

댓글작성자의 아이디

사용자의 아이디가 같은것만 

갖고오게 된다

 

사진 1번 (사진#1) 에 달린 것만 추려주려면

PHOTO ID 가 1번인 것만 골라주면 된다

 

1번만 남기고

나머지 것들은 지워준다

WHERE 절을 쓰면서

COMMENTS 테이블

PHOTO_ID가 1번인 것만 설정

 

이렇게 설정해주면

사진 1번이 아닌 것들은

다 지워지게된다

댓글 내용과 닉네임을 골라주려면

 SELECT 절을 사용해서

COMMENT의 내용(comments.body)을 갖고와주고

USERS의 닉네임(user.nickname)을 설정한다

 

결과적으로 이렇게 데이터가 남게됨

INNER 조인 #2 (특정 사진의 파일명과 게시자 닉네임)

FROM 절에서 PHOTOS 갖고오고

PHOTO 에 USER 을 붙임 (JOIN)

 

USER의 아이디(USERS.ID)

사진을 게시한

게시자의 아이디와 일치해야함

 

그러고 사진 5번에 해당되는 것만

갖고오면 된다

6번과 7번 PHOTOS 에는

게시자의 아이디가 NULL 값이다

 

NULL - 아무것도 없음을 의미

 

ID 에는 NULL 값을 가진 ID 가 없기 떄문에

형광부분엔 아무것도 올 수 없게 됨

 

그리고 6번, 7번도 자동적으로 사라진다

결과적으로 두 가지만 남음

INNER 조인 #3 ( 특정 사진 좋아요한 사용자 닉네임과 사진파일명)

- JOIN 3 TABLES -

좋아요 TABLE 을 갖고와준다

(LIKES)

LIKES 에다가 USERS 를 JOIN 한다

조건 - USER의 ID 가 LIKES 의 USER_ID 와 같아야 함

 

USER ID - FK

ID - PK

좋아요를 누른 사용자의 아이디랑

사용자의 아이디가 같아야 함

 

좋아요 대상 사진의 파일명 ( PHOTO ID)

하고도 연결해줘야 함

파란 블럭 둘이

같아야한다

그리고 이제 사진 2와 관련된

레코드만 남겨주고

NICKNAME

FILENAMES만 남겨주면 끝

LEFT 조인이란 (INNER 조인과 비교)

LEFT JOIN:

두 테이블의 공통 데이터 뿐만 아니라

나머지 좌측 테이블의 모두를

갖고오는 문법

예시)

4개의 회사와 2개의 자동차 모델이

있다고 가정할 때,

 

MODEL 3 는 테슬라에서

G80은 현대에서 만들었음을 알 수 있다

그림으로 나타내면 다음과 같다

 

INNER JOIN으로 보면

PKFK 에 3 하고 4가 존재하고

우측과 같은 표가 만들어짐

LEFT JOIN도 비슷하게

양쪽 모두 존재하는 3 하고 4를 기준으로

데이터를 갖고온다

 

추가로 왼쪽 테이블의

나머지 값들을 갖고옴

연관된 우측 테이블 값이 없는 경우에는

나머지 값들을 NULL로 채워넣는다

 

결론:
공통된 부분을 먼저 JOIN 하고

추가로 나머지를 다 갖고오는데

JOIN 될 수 없는 것들은

빈 값(NULL)로 채움

LEFT 조인 #1 (모든 사진에 게시자 정보 붙이기)

한 명의 사람이

여러 개의 사진 올릴 수 있으므로

일대다 관계

user_id 라는 FK를 통해서

user의 id (PK) 를 가리키고 있는 상태

1.모든 사진의 파일명 조회

SELECT 를 통해 전체조회

FROM 을 사용하여 PHOTOS 에서 갖고온다

PHOTOS 에 게시자의 닉넴도 갖고온다

게시자의 닉넴은 USERS 에 있다

JOIN을 사용

USERS 의 ID 가 PHOTOS 의 USER_ID 와

같아야 한다

(INNER JOIN)

 

6 , 7 번의 NULL값은

삭제가 된다

하지만 모든 사진의 파일명을 조회하는 것이라

INNER JOIN 만 쓰면

JOIN 된 것 만 갖고오게 된다

그럴 땐, LEFT 를 붙여서

LEFT JOIN 을 사용

그럼 PHOTOS LEFT TABLE

즉, 왼쪽 테이블이 되는것이고

PHOTOS 는 모두 다 갖고옴

 

PHOTOS 에 있는 모든 데이터를 갖고 오되,

있는 것들만 추가해서 붙여주게 된다

없는 것들은 (NULL)

지워지는게 X

NULL 이 들어가게 된다

왼쪽 테이블(A)은 모두 갖고오게되고 

오른쪽 테이블(B)를 조인해서

조인이 되는 것만 붙여넣는다

 

JOIN이 안된부분은

NULL 값을 갖고

빈공간의 값을 붙여주는 것

파일명과 닉네임을 갖고오니까

SELECT 를 사용해서 갖고옴

 

 LEFT JOIN #2 ( 모든 댓글에 사진 정보 붙이기)

- LEFT JOIN -  

COMMENTS 테이블이

LEFT 테이블로 오고

PHOTOS JOIN 되고

JOIN이 안된 부분은

NULL 값으로 채운다

- 테이블 관계 -

 일대다 관계

사진 하나에 댓글 여러개 가능

C.PHOTO_ID - FK

PHOTO.ID - PK

1) 모든 댓글 조회하기 

SELECT * FROM

 COMMENTS 를 불러오면

우측표처럼 COMMENTS 가 다 불러와진다

2) 댓글이 달린 사진의 파일명 갖고오기 

 PHOTOS 를 붙인다 (JOIN)

LEFT JOIN 을 사용

ON - 조건

PK와 FK가 같아야 함

(PHOTOS 의 ID 와

COMMENTS PHOTO_ID와 같아야 함)

3) NULL 값 채우기

LEFT JOIN 이니까

우측에 NULL 값이 채워지게 됨

4) 내용과 파일명 갖고오려면

SELECT 이용해서

내용과 파일명 갖고 옴

RIGHT 조인과 FULL 조인

RIGHT JOIN:

우측 테이블에 JOIN 가능한

좌측 테이블을 붙이는 것

 

우측 테이블 기준

FK 와 PK로 연결된 상태

 LEFT JOIN :

좌측 스마트폰 테이블을

모두 갖고 온 다음에

 

우측 회사 테이블에서

JOIN 가능한 데이터를

붙여온다

 

RIGHT JOIN:

먼저 JOIN 가능한 데이터를

다 갖고 온 다음에

나머지 JOIN되지 않는 데이터들 중에서

우측 테이블 것만 갖고 옴

 

결과적으로 우측 테이블에

JOIN가능한 좌측 테이블을 붙이는 형태인 것

 

FULL JOIN:

JOIN 가능한 데이터 뿐만 아니라

불가능한 것까지도

좌, 우측 상관없이 모두 갖고오는 것

JOIN 가능한 것을 먼저 갖고 온 다음에

좌측과 우측 서로 붙임 

728x90
반응형