Wecode - Project 3 (부트캠프)/Project 3 과정

[SQL복습 ] mysql 과제 1번 (1-1,2,3,4)

JBS 12 2023. 10. 16. 09:22

foundation 때 대충 했던 

 

[MySQL로 Database 만들기] 1. DDL, DML 사용 (ERD 연결)

이후 프로젝크 3차 하면서 sql 공부하면서 채우게 된 [SQL복습 ] 과제 https://pm-developer-justdoit.tistory.com/70 Foundation 2 과제 - sns posting 게시물 CRUD [포스팅 생성, 조회, update, 삭제] ** westagram을 만들 건데

pm-developer-justdoit.tistory.com

 

Foundation 2 과제 - sns posting 게시물 CRUD [포스팅 생성, 조회, update, 삭제] **

westagram을 만들 건데 백엔드는 기능만 만드는 것. [백엔드가 넣을 기능들] Express를 이용한 API 서버 만들기 - Express초기 환경세팅 (이미 했고) [Westagram Backend Project] 1. Express 초기 환경 설정/ TypeORM 설

pm-developer-justdoit.tistory.com

제대로 해본다

 

1. fk 까지 만드는게.. 

 

 

create database 하면서 대충 칼럼 형식 맞추고

alter modify, alter add로 만듦 -> desc 로 확인 

insert into로 칼럼에 값 넣었다 -> select * from 으로 확인 

 

 

외래키 만드는 법 

 

 

- 괄호가 들어가야 하고, 

REFERENCES users (user_id)가 아니라 id

 

 

1번 
created database~ 
alter ~ add ~ 
alter ~ modify  (애초에 create으로 할 떄 잘못 넣은 거) 
desc 


pk, fk 설정 잘 해야, Join 가능 
desc로 pk, fk 나왔는지
그런 것들 확인 

 


 

insert into ( ) VALUES ( ) 

 

2번

insert into ~ 
update set ~ 
select * from 

(없던 칼럼 추가 시 )
alter ~ add ~ 
alter ~ modify
desc 

일단, inner join은 교집합이니까 표에 NULL 이 나올 수 없다!~ 

그럼 outerjoin이고, 합집합은 아님. 그럼 left join 

users 테이블을 왼쪽으로 두고 기준으로. 


join을 위해 users 테이블에 post_id가 필요했다. 

그리고 1번에서 fk 외래키 적용도 필요했음 


실험 1

SELECT users.id, users.name, users.post_id, posts.title, posts.content FROM users LEFT JOIN posts ON users.post_id = posts.id;

실험 2 

SELECT users.id, users.name, users.post_id, posts.title, posts.content FROM users righT JOIN posts ON users.post_id = posts.id;

실험 3

mysql> SELECT users.id, users.name, users.post_id, posts.title, posts.content FROM users LEFT JOIN posts ON users.post_id = posts.id;

[3번 정답]

mysql> SELECT users.id, users.name, users.post_id, posts.title, posts.content FROM users LEFT JOIN posts ON users.id = posts.user_id;

따로 써보면 아래와 같다


mysql> select users.id,
    -> users.name,
    -> posts.id,
    -> posts.title,
    -> posts.content fRom users left join posts on users.id=posts.user_id;

 

3번

join 을 해야 한다는 것을 파악 

join 중에 어떤 Join일지 판단 

 


나는, 4번을

칼럼 추가해서 update로 넣었는데 잘못된 방법이였음.

 

칼럼 추가가 아니라, join 해야 함

1. 'user 테이블 -like테이블' join

2. 그걸 'post' 테이블에 조인

 

[잘못된 풀이]  이후에 [바른 풀이] 가겠다. 

 

[잘못된 풀이] 

 

좋아요 누르는 사람이 아닌, 작성자가 Rebekah로했다 

- posts 테이블엔 name 대신 user_id 칼럼이 있어서 

Rebekah를 user_id로 표현 

 

select id, title, content FROM posts WHERE user_id=1 AND content LIKE '%무엇인가?';

 

4번 

일단 posts에 author, user_like 추가 함 

 

ALTER TABLE posts ADD author VARCHAR(50) 

(뒤에 NULL/ NOT NULL 안 붙이니까 그냥 NULL로 들어감)

 

ALTER TABLE posts ADD like_user  VARCHAR(50) 

 

desc posts 해보니, 1번에서 fk 연결이 안 돼서 해야 함 

 

fk설정하는 법

likes에도 fk 추가하고 

 

보니까 comments id가 설정 안 돼 있어서

 

pk 설정하는 법 
mysql>  ALTER TABLE comments  ADD PRIMARY KEY (id); 이다 


mysql>  ALTER TABLE comments  ADD PRIMARY KEY (comment_id); 가 아니다 

 


 

이제는 author, like_user 칼럼 만든 것에, 값을 추가해야 한다

 

오류1. insert into가 아니라 update를 해야 한다. 왜냐하면, insert into는 새로운 열을 추가하는 거라서, 

원하는 칼럼만 넣고, 값을 넣는 게 아니라,(--> 이거는 update) 모든 열을 다 언급해주고 거기에 상응하는 값을 넣어줘야 한다. 

그래서,  

 

update 를 할 때에는, post_id가  필요하다는 점 

원하는 칼럼만 추가하면 되긴 하지만 어디에 추가하는지를 알아야 하니. 

 

 

update set 쿼리문 -> 쉼표로 한번에 두개 변경 

 

 

일단 찍혔는지 확인 -> 전체 표로 

 

이제 아래 표와 같이만 나오게 해야 한다. ㅡ-> ”Rebekah”라는 이름을 가진 사용자가 좋아요하고 있는 게시물 중에서 “무엇인가?”라는 단어가 포함된 게시물만 출력해

 

<4번 완성 결과뮬> 


[바른 풀이]

 

칼럼 추가가 아니라, join 해야 함

1. 'user 테이블 -like테이블' join

2. 그걸 'post' 테이블에 조인

그걸 어떻게 아느냐? 

문제에, author와 like_user 컬럼명으로 출력해달라 했다. 

즉, like와 user를 join해라 라는 힌트.

 

일단 like와 user를 join 해보지.

hint! 

어떤 칼럼을 뽑아낼지 모른다면, 일단 select * from으로 하자!
그리고 결과 출력된 거 보고,
어떤 칼럼을 넣을지 판단 하면 된다! 

그리고, inner join ( = join) / outer join (left join, right join) 모른다면 일단 
그냥 join으로 해보자! 
그리고 결과 출력된 거 보고 판단 하면 된다! 
(join = inner join이라는 것도 출력된 거 보고 안 것) 
앗 나의 실수! 
테이블 이름은 users. 
fk 이름은 user_id 
pk는 user.id 

s 붙이는 것과 
. _ 유의하자! 

계속된 에러

도움을 얻기 위해 chatGPT 

*테이블 복사해서 붙여넣기 해도 가능하다는 꿀팁! 

 

아하! 

posts 테이블에 author 칼럼을 추가하는게 아니라, 

users 테이블의 name 칼럼을 author로  (포스트를 쓴 사람 이름이니까, posts 테이블에 user_id에 해당하는 user_name이군) 

 

아하! 

users 테이블과 likes 테이블을

likes의 user_id를 기준으로 join 했는데, 그거를 like_user 칼럼으로 표시해서, 

 

likes를 누른 user만 보이게. --> 좋아요 누른 사용자 정보 

likes_user 칼럼에 ! 

좋아요 안 눌렀으면 NULL


아하!  FROM posts 다음 join  구문 오니까,

posts 테이블 기준

 

AS  없이 바로, 명칭 가능 

 

posts를 p로 부를건데, 

users 를 u 로 부를건데 

 

users 와 posts 테이블을 user_id으로 연결 join. --> 게시물을 누가 작성했는지 '게시물 작성자' 알 수 

그 likes 와 posts 테이블을 post_id 기준으로 left join  --> left join. = 모든 게시물 가져온다 / 좋아요 한 경우 가져옴 

users 와 likes 테이블을 user_id 기준으로 left join --> '좋아요 누른 사용자' 가져옴 /likes 기준으로,  


 

 

즉, 어떤 사용자가 좋아요를 하고 있는 게시물인지 알아야 하니! 

 

사용자 - 좋아요 (좋아요 한 사용자만 데리고 오기, 좋아요 기준) 

사용자 - 게시물 (게시물의 사용자에 대한 정보)

좋아요- 게시물 (좋아요가 눌린 게시물) 

 

 

 

 

users 를 두번 쓰는데, 그대로 users 로 하면 안 된다는 점

 

 

users 를 u1 

users 를 u2로 해야 하는 이유

 

 

 

근데 이렇게 해도 되긴 하다.

select할때는 똑같이 user.name으로 하고, 

join할 때 users를 u2로만 하고, user.id 는 냅두고

 

 

 

 

줄임을 모두 쓴 버전