[SQL] 데이터 분석, 활용 _ 테이블 조인 _ lNNER JOIN

강지영·2023년 2월 21일
0

📚 JOIN

테이블 정보를 합치는 것!
ex) 인스타 댓글을 보면 유저 아이디와 댓글이 함께 보이는 데 이처럼 각각의 테이블을 나눠진 데이터를 함께 보여질려고 할 때 조인을 사용한다.

조인은 크게 내부 조인(INNER JOIN)외부 조인(OUTER JOIN)으로 나뉘는 데
외부 조인은 LEFT JOIN | RIGHT JOIN | FULL JOIN으로 나뉜다.

💡어떻게 조인될까요?

다음 쿼리는 댓글과 사용자 정보를 합쳐준다.
[ 순서 ]
1) FROM절에서 댓글을 가져온 후,
2) JOIN 사용자 레코드를 앞서 가져온 댓글에 붙여주는 데
이 때 조인 조건을 줘서 대상을 찾고 이를 연결합니다.
[ 결론 ]
📌 JOIN 조건을 걸려서으로 FROM절의 데이터와 JOIN절의 데이터를 합친다.

결국 JOIN은 두 테이블을 하나로 합쳐 가져 오는 것이다.

이렇게 두 테이블의 교집합을 가져와 조인하는 것을 INNER JOIN이라고 한다.

  • INNER 조인
    조건을 만족하는 것만 조인하여 가져옴

  • LEFT 조인
    좌측 테이블 모두를 가져오는데, 조건을 만족하는 것은 조인해서 가져옴

  • RIGHT 조인
    우측 테이블 모두를 가져오는데, 조건을 만족하는 것은 조인해서 가져옴

  • FULL 조인
    좌-우측 테이블 모두를 가져오는데, 조건을 만족하는 것은 조인해서 가져옴


INNER JOIN 실습하기

준비

  • 기존 테이블 삭제
DROP TABLE likes;
DROP TABLE settings;
DROP TABLE comments;
DROP TABLE photos;
DROP TABLE users;
  • 테이블 재생성
-- users 테이블
CREATE TABLE users (
  id       SERIAL       PRIMARY KEY,
  nickname VARCHAR(50),
  email    VARCHAR(100)
);
-- photos 테이블
CREATE TABLE photos (
  id       SERIAL        PRIMARY KEY,
  filename VARCHAR(255),
  user_id  INTEGER       REFERENCES users(id)
);
-- comments 테이블
CREATE TABLE comments (
  id       SERIAL         PRIMARY KEY,
  body     VARCHAR(1000),
  user_id  INTEGER        REFERENCES users(id),
  photo_id INTEGER        REFERENCES photos(id)
);
-- settings 테이블
CREATE TABLE settings (
  id            SERIAL       PRIMARY KEY,
  private       BOOLEAN,
  adding_photos VARCHAR(15),
  user_id       INTEGER      UNIQUE REFERENCES users(id)
);
-- likes 테이블 생성(사용자와 사진을 다대다 연결)
CREATE TABLE likes (
  id       SERIAL  PRIMARY KEY,
  user_id  INTEGER REFERENCES users(id),
  photo_id INTEGER REFERENCES photos(id)
);
  • 레코드 재등록
-- users 레코드
INSERT INTO
  users(nickname, email)
VALUES
  ('cloudstudying_kr', 'mail@cloudstudying.kr'),
  ('hongpark_cs',      'sehongpark@cloudstudying.kr'),
  ('haesamq',          'haesamq@naver.com')
;
-- photos 레코드
INSERT INTO
  photos(filename, user_id)
VALUES
  ('cat-on-road.jpg',           1),
  ('sunset-over-the-ocean.jpg', 1),
  ('andromeda-galaxy.jpg',      1),
  ('white-tiger.jpg',           2),
  ('nero-the-black-cat.jpg',    2),
  ('deleted-image.jpg',         NULL),
  ('blocked-image.jpg',         NULL)
;
-- comments 레코드
INSERT INTO
  comments(body, user_id, photo_id)
VALUES
  ('meow',             1, 1),
  ('nyaong',           2, 1),
  ('냐옹',              3, 1),
  ('sunset',           1, 2),
  ('falling slowly',   2, 2),
  ('Andromeda galaxy', 1, 3),
  ('mysteriouse..!',   3, 3),
  ('wow..!',           3, NULL),
  ('oh..!',            3, NULL)
;
-- settings 레코드
INSERT INTO
  settings(private, adding_photos, user_id)
VALUES
  (FALSE, 'MANUAL', 1),
  (FALSE, 'AUTO',   2),
  (TRUE,  'AUTO',   3)
;
-- likes 레코드
INSERT INTO
  likes(user_id, photo_id)
VALUES
  (1,    1),
  (2,    1),
  (1,    2),
  (2,    2),
  (3,    2),
  (1,    3),
  (3,    3),
  (NULL, 6),
  (NULL, 7)
;

실습

  • “사진#1”에 달린 모든 “댓글 내용”과 작성자 “닉네임”을 조회하시오.
SELECT 
	comments.body, users.nickname
FROM 
	COMMENTS
JOIN USERS ON 
	users.id = COMMENTS.user_id
WHERE 
	comments.photo_id = 1;
  • “사진#5”의 “파일명”과 사진 게시자 “닉네임”을 조회하시오.
SELECT 
	photos.filename, users.nickname
FROM
	PHOTOS
JOIN USERS ON
	users.id = PHOTOS.user_id
WHERE
	photos.id = 5;
  • “사진#2”에 좋아요를 누른 사용자 “닉네임”과 대상 사진의 “파일명”
SELECT
	USERS.NICKNAME, PHOTOS.FILENAME
FROM 
	LIKES
JOIN USERS ON
	USERS.ID = LIKES.USER_ID
JOIN PHOTOS ON
	PHOTOS.ID = LIKES.PHOTO_ID
WHERE
	PHOTOS.ID = 2
;
profile
Hello World!

0개의 댓글