테이블 정보를 합치는 것!
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 조인
좌-우측 테이블 모두를 가져오는데, 조건을 만족하는 것은 조인해서 가져옴
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)
;
SELECT
comments.body, users.nickname
FROM
COMMENTS
JOIN USERS ON
users.id = COMMENTS.user_id
WHERE
comments.photo_id = 1;
SELECT
photos.filename, users.nickname
FROM
PHOTOS
JOIN USERS ON
users.id = PHOTOS.user_id
WHERE
photos.id = 5;
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
;