외부활동/UMC 2기 서버[Node]

5주차 - 인스타그램 erd설계 및 데이터베이스 쿼리 실습 with AQeryTool

softmoca__ 2024. 1. 24. 19:09
목차

 

 

User 테이블

 

Post 테이블

CommentLike 테이블

PostLike 테이블

PostImg 테이블

 

 

위 테이블들을 rds에 생성을 해보자 !

원래 FK연결을 해주어야 하지만 난 무료 버전이라 대충 sql문만 따오는 용도로 만듬.

근데 궁금한게 FK연결을 따로 안해줘도 sql문 상에는 차이가 없는데 왜 그런건지 모르겠다.

그저 연결관계만 보여주는게 끝인건가..?

 

 

데이터 베이스를 생성 안하고 erd를rds에 생성하려고 하자 오류가 나서 데이트베이스를 생성을 다시 sql을 넣어줌

 

 

쿼리문의 경우 기본적으로 SELECT, FROM, WHERE로 구성된다.

  • SELECT : 원하는 요소를 가져온다.
  • FROM : 가져오는 테이블을 지칭한다.
  • WHERE : 쿼리문에서의 조건이라 생각하면 편하다.
SELECT name,nickName
FROM User
WHERE userIdx=3;

User테이블에서 name과 nickName을 가져오게 된다.

 

SELECT COUNT(postIdx) FROM Post WHERE status='ACTIVE' and userIdx=2;

Post에서 활성화 상태이면서, userIdx가 2번인 사람의 postIdx를 구하는 것이다

 

SELECT COUNT(postIdx) FROM Post WHERE status='ACTIVE' and userIdx=2;

Post에서 활성화 상태이면서, userIdx가 2번인 사람의 postIdx를 구하는 것이다

그러면 다음과 같이 postIdx가 2와 3이 반환되는데, 반환되는 postIdx의 갯수를 COUNT함수를 이용하여 센다.

 

이제 join함수를 사용해보자.

 

SELECT name, nickName, profileImgUrl, Post.postIdx
FROM User join Post on Post.userIdx = User.userIdx and Post.status='ACTIVE'
WHERE User.status='ACTIVE' and User.userIdx=2;

가장 중요한 것은 FROM 과 WHERE 에서 다른 테이블을 연결하는 과정이기에, 인자 이름이 겹쳐질 수도 있다.

따라서 이를 방지하기위해 객체와 같은 방법을 사용한다.

 

SELECT name, nickName , profileImgUrl , postIdx
FROM User
           join (SELECT postIdx, userIdx
           FROM Post
           WHERE status='ACTIVE') p on p.userIdx=User.userIdx
WHERE User.status='ACTIVE' and User.userIdx=2;

 

 

join의 안쪽을 자세히 보면, Post에서 ACTIVE인 상태의 postIdx와 userIdx을 가져온다.

그리고 이를 p라고 지칭한다. 이후 p.userIdx와 User.userIdx가 같은 경우를 모두 표시한다.