DB/PostgreSQL

14. INNER JOIN 실습

DEV-HJ 2022. 10. 31. 00:07
반응형

테이블 삭제 DROP

-- 기존 테이블 삭제
DROP TABLE likes;
DROP TABLE settings;
DROP TABLE comments;
DROP TABLE photos;
DROP TABLE users;

테이블 새로 CREATE


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

테이블 레코드 추가 INSERT

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

INNER JOIN 문제1

-- 사진1에 달린 모든 댓글내용과 작성자의 닉네임을 조회하시오
SELECT body, users.nickname
	FROM comments
JOIN users ON
	users.id = comments.user_id
WHERE photo_id = 1;


INNER JOIN 문제2

-- 사진5번 파일의 파일명과 사진 게시자 닉네임을 조회하시오
SELECT filename, users.nickname
	FROM photos 
JOIN users ON
	photos.user_id = users.id
WHERE
	photos.id = 5;


INNER JOIN 문제3

-- 사진2를 좋아요한 사용자의 닉네임과 대상 사진의 파일명
SELECT 
	users.nickname, photos.filename
FROM likes
JOIN photos ON
	likes.photo_id = photos.id
JOIN users ON
	likes.user_id = users.id
WHERE likes.photo_id = 2;

 

반응형