
[개념은 호옹~, 실습 빡]
SQL 데이터 분석, 활용!
참고사이트:
테이블 조인(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으로 보면
PK 와 FK 에 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 가능한 것을 먼저 갖고 온 다음에

좌측과 우측 서로 붙임
'> 프로그래밍 언어 > SQL' 카테고리의 다른 글
[SQL 데이터 분석, 활용!] 섹션 7. 그룹화의 집계 (0) | 2023.02.16 |
---|---|
[SQL 데이터 분석, 활용!] 섹션 6. 그룹화의 집계 (2) | 2023.02.16 |
[SQL 데이터 분석, 활용!] 섹션 2. 일대다, 다대다 관계 (0) | 2023.02.13 |
[SQL 데이터 분석, 활용!] 섹션 1. 일대다 관계 (0) | 2023.02.13 |
[SQL 데이터 분석, 입문!] 섹션 3. 시간 값 필터링 (0) | 2023.02.10 |