MySQL 테이블 Left join을 해봅니다. 사실 데이터베이스를 작성하다 보면, 테이블끼리 연결 지어야 할 때, 혹은 어떠한 기준을 조건으로 두 테이블을 연결해, 결과를 출력할 필요가 생기죠. 이럴 때 쓰는 SQL의 언어가 join인데요. 사용하는 방법도 의외로 간단하니 아래의 글을 참고해 주세요.
서론 : Table join
Table join을 위해서는 테이블의 특성을 잘 이해해야 할 텐데요. Table join의 특징이라고 한다면 각각의 테이블은 각각의 정보만 가지고 있다는 점입니다. 이 점이 어떻게 보면 굉장히 편리한 구조로 확인할 수 있다고 생각하겠지만, 대량의 데이터베이스를 접목하다 보면 특정의 테이블의 값을 요구하는 경우가 나타납니다.
이때 필요한 게 Table join인데요. Table join의 경우에는 "어떤 테이블에서 어떤 조건을 비교할 것이니?"를 중점으로 사용해 주시면 되는데 간단한 예제를 들어 설명을 도와드리겠습니다.
(1) Table join의 종류
Table join의 종류로는 inner join, left join, right join, full join이 존재하는데요. 각각의 조인들의 특징을 살펴보도록 하겠습니다.
inner join : 조건을 만족하는 것만 join 하여 가져오는 것을 말합니다.
left join : 좌측 테이블 모두를 가져오는데, 조건을 만족하는 것을 조인해서 가져옵니다.
right join : 우측 테이블 모두를 가져오는데, 조건을 만족하는 것을 조인해서 가져옵니다,
full join : 좌 우측 테이블을 모두 가져오는데, 조건을 만족하는 것을 조인해서 가져옵니다.
본론 Table join의 간단한 예제
저는 유저 정보를 저장하는 테이블과 게시판의 게시글을 저장하는 포스트 테이블을 먼저 만들어줄게요. 이 테이블이 있어야 조인을 하든, 분리를 하든 할 테니깐요.
CREATE TABLE users (
id int PRIMARY KEY auto_increment,
nickname VARCHAR(50),
email VARCHAR(100)
);
CREATE TABLE photos (
id int PRIMARY KEY auto_increment,
filename VARCHAR(255),
user_id int,
foreign key (user_id) references users(id)
);
CREATE TABLE comments (
id int PRIMARY KEY auto_increment,
body VARCHAR(1000),
user_id INT,
photo_id INT,
foreign key (user_id) REFERENCES users(id),
foreign key (photo_id) REFERENCES photos(id)
);
이렇게 세 가지 테이블을 작성했다고 합니다. 코드 중 primary key는 기본키, auto_incremnet는 자동으로 숫자가 생성되는 키 (간단히 글을 작성할 때마다 연번이 생성된다고 생각하시면 됩니다) 그 외 foreign key는 외래키인데요. 이 부분에 대해서는 다른 포스팅에서 다루겠습니다.
이렇게 세 가지 테이블을 작성하고 이제 join을 통해서 조건을 접목시켜 줄 텐데요. 댓글을 달았던 사용자의 댓글 사용자 정보를 join 한다고 가정해 봅니다.
(1) 순서 1. 테이블에 접근합니다.
"나, comments의 테이블에 접근할 거야"
from
comments c
(2) 순서 2. 그리고 다른 테이블과 연결해 줍니다.
"나, user 테이블과 연결해 줄래"
join
user u
(3) 순서 3. 테이블의 어떤 조건과 비교할지 작성해 줍니다.
on
c.user_id = u.id;
여기서 테이블 옆에 붙여지는 소문자들은 테이블을 모두 작성하기에는 귀찮은 부분도 있어서 별명을 지어주는 겁니다. 자바의 변수처럼요. 만일 이게 더 불편하다 하시는 분들은 'on comments.user_id = user.id; 이런 식으로 풀네임으로 작성해 주면 됩니다.
아래의 실습예제는 KH정보교육원에서 국비수업을 받으며 제공받은 자료입니다. 이에 실습예제의 해설을 작성해 보겠습니다. 해설은 제가 임의로 작성하는 것이니, 틀리거나 맞지 않는 부분이 있다면 얘기해 주세요.
결론 : 코드정리
(1) 실습예제 : 사진 1번의 모든 댓글 내용과, 작성자 닉네임을 조회하세요.
위의 예제에서 저는 출력해야 하는 것을 먼저 읽습니다. 그래서 '모든 댓글의 내용' 그리고 '작성자의 닉네임'이라고 표시된 것을 보고, select를 이용하여 출력해야 함을 머리로 먼저 생각하게 됩니다.
(하지만 미리 적지는 않습니다. 위의 적힌 순서대로 처리하는 것이 덜 헷갈릴 수 있는 길이니깐요) 그럼 어느 테이블에서 무엇을 가져올지 생각해 봅니다. 위의 테이블을 참고한다면, 'comments' 댓글을 보아야, 댓글의 내용이라던지, 댓글을 단 작성자의 닉네임을 알 수 있기 때문에 코멘트를 먼저 불러오도록 합니다.
from
comments
그리고 연결할 테이블을 선택해야 하는데요. 문제를 보았을 때, 사진 1번의 내용을 알아야 하기에 potos를, 그리고 작성자의 닉네임을 알아야 하기 때문에 작성자의 정보가 들어있는 user를 연결해 줄 겁니다.
comment의 표를 자세히 본다면, comment의 user_id와 user의 id를 연결해 줄 수 있는 것을 볼 수 있죠.
join
users
on
comments.user_id = users.id
그렇기 때문에 users를 먼저 연결해 주고, on을 이용해 댓글의 작성자 아이디와, 유저의 아이디가 같은지 물어봅니다.
단, 여기서 조건을 설정해 주어야겠죠. "단, 댓글 중 사진 1번에서 말이야"라고요.
where
comments.photo_id = 1;
이와 똑같은 문제로 " 사진 n번의 작성자 닉네임을 조회하세요 " 등을 SQL을 통해 풀어보실 수 있습니다.
(2) 심화예제 : 사진 2번의 좋아요를 누른 사용자의 닉네임 대상 사진의 파일명을 조회하세요.
만일 사진 2번의 좋아요를 누른 사용자의 닉네임 대상 사진 파일명을 조회한다고 하면, 조금 문제가 난해해지는 것 같아요.
그럼 일단 조회하고자 하는 것을 먼저 머리로 생각하시고요 ( 저는 파일명과, 닉네임을 생각했습니다)
기준으로 잡을 테이블 한 개와, 연결할 테이블을 이번엔 두 개의 테이블을 생각해 볼게요. 저는 photos와 user를 연결해 본다고 합니다. 이제 답안이 아니라, 임의로 제가 작성해 보겠습니다.
from
likes
join
users
on
user_id = likes.user_id
join
photos
on
photo_id = likes.photo_id
그리고 조건을 한번 더 줘보겠습니다. "사진 2번이야"
where
photo.id = 2;
여러분들도 답안과 함께 본인이 쓰신 것을 비교해보세요. 얼추 맞는 것 같죠?
select
filename,
nickname
from
likes
join
users
on
users.id = likes.user_id
join
photos
on
photos.id = likes.photo_id
where
photos.id = 2;
'MySQL' 카테고리의 다른 글
MySQL Subquery (1) : Select 문에 Subquery를 적용하자 (0) | 2023.11.05 |
---|---|
MySQL의 제약조건 Primary key "야 중복 값 입력하지 마라고" (0) | 2023.11.03 |
MySQL 테이블 생성하기 (0) | 2023.10.30 |
댓글