JOIN은 두 개 이상의 테이블 간에 데이터를 결합하는 데 사용되는 키워드이다. JOIN문을 사용하면 데이터베이스에서 여러 테이블의 열을 사용하여 연결된 데이터를 하나의 결과 집합으로 가져올 수 있다.
table
iNSERT INTO user_tb(username, password, profile_url, email, createDate) VALUES('ssar', '1234' , '/profile/1.jpg', 'ssar@nate.com', now()); INSERT INTO user_tb(username, password, profile_url, email, createDate) VALUES('cos', '1234' , '/profile/2.jpg', 'cos@nate.com', now()); INSERT INTO user_tb(username, password, profile_url, email, createDate) VALUES('love', '1234' , '/profile/3.jpg', 'love@nate.com', now()); INSERT INTO image_tb(photo_url, content, user_id, createDate) values('/image/1.jpg', '여행사진', 1, now()); INSERT INTO image_tb(photo_url, content, user_id, createDate) values('/image/2.jpg', '강아지사진', 1, now()); INSERT INTO image_tb(photo_url, content, user_id, createDate) values('/image/3.jpg', '친구사진', 2, now()); INSERT INTO love_tb(user_id, image_id, createDate) values(1, 1, now()); INSERT INTO love_tb(user_id, image_id, createDate) values(2, 2, now()); INSERT INTO love_tb(user_id, image_id, createDate) values(2, 3, now()); INSERT INTO love_tb(user_id, image_id, createDate) values(3, 3, now()); INSERT INTO reply_tb(content, user_id, image_id, createDate) VALUES('재밌겠다~~!', 1, 1, now());
더미 데이터
INSERT INTO user_tb(username, password, profile_url, email, createDate) VALUES('ssar', '1234' , '/profile/1.jpg', 'ssar@nate.com', now()); INSERT INTO user_tb(username, password, profile_url, email, createDate) VALUES('cos', '1234' , '/profile/2.jpg', 'cos@nate.com', now()); INSERT INTO user_tb(username, password, profile_url, email, createDate) VALUES('love', '1234' , '/profile/3.jpg', 'love@nate.com', now()); INSERT INTO image_tb(photo_url, content, user_id, createDate) values('/image/1.jpg', '여행사진', 1, now()); INSERT INTO image_tb(photo_url, content, user_id, createDate) values('/image/2.jpg', '강아지사진', 1, now()); INSERT INTO image_tb(photo_url, content, user_id, createDate) values('/image/3.jpg', '친구사진', 2, now()); INSERT INTO love_tb(user_id, image_id, createDate) values(1, 1, now()); INSERT INTO love_tb(user_id, image_id, createDate) values(2, 2, now()); INSERT INTO love_tb(user_id, image_id, createDate) values(2, 3, now()); INSERT INTO love_tb(user_id, image_id, createDate) values(3, 3, now()); INSERT INTO reply_tb(content, user_id, image_id, createDate) VALUES('재밌겠다~~!', 1, 1, now());
1. inner join
inner join 은 두 개 이상의 테이블에서 특정 열의 값이 일치하는 행들을 결합하여 결과를 생성한다.
SELECT 열 목록 FROM 첫 번째 테이블 INNER JOIN 두 번째 테이블 ON 조인 조건 WHERE 검색 조건
inner join 은 공통된 부분을 테이블로 만들어낸다.
select * from image_tb img inner join user_tb u on img.user_id = u.id
select img.*, rp.* from reply_tb rp inner join image_tb img on rp.image_id = img.id;
2. outer join
outer join은 두 개 이상의 테이블에서 특정 열의 값이 일치하지 않더라도 해당 행을 포함하여 결과를 생성한다.
outer join에는 LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN 세 가지가 있다.
LEFT OUTER JOIN
SELECT 열 목록 FROM LEFT 테이블 LEFT OUTER JOIN 테이블 ON 조인 조건 WHERE 검색 조건
LEFT OUTER JOIN 은 왼쪽 테이블의 모든 행을 포함하며, 오른쪽 테이블과 일치하는 행이 있는 경우에는 일치하는 행을 포함한다. 치하지 않는 경우에는 오른쪽 테이블의 열은 NULL로 채워진다.
select img.*, rp.* from image_tb img left outer join reply_tb rp on rp.image_id = img.id;
RIGHT OUTER JOIN
SELECT 열 목록 FROM RIGHT 테이블 LEFT OUTER JOIN 테이블 ON 조인 조건 WHERE 검색 조건
RIGHT OUTER JOIN은 왼쪽 테이블과 오른쪽 테이블 중에서 오른쪽 테이블의 모든 행을 포함하며, 왼쪽 테이블과 일치하는 행이 있는 경우에는 일치하는 행을 포함한다.
select img.*, rp.* from reply_tb rp right outer join image_tb img on rp.image_id = img.id;
outer join문은 그림으로 더 알아보자.
사진 출처
Share article