foundation 때 대충 했던
제대로 해본다
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 는 냅두고
줄임을 모두 쓴 버전
'Wecode - Project 3 (부트캠프) > Project 3 과정' 카테고리의 다른 글
Project 3: [주문 api] 코드 작성 (0) | 2023.10.17 |
---|---|
Project 3- 2차 sprint meeting (0) | 2023.10.16 |
Project 3- Software Test 세션 ** (0) | 2023.10.15 |
Project3: sprint 1 - 금요일 standing 미팅, 기능정의서 api (0) | 2023.10.13 |
SQL 복습 - DATA 검색, 조회, 정렬, 필터링, 페이지네이션 ; SELECT, INNER/LEFT JOIN, GROUP BY (0) | 2023.10.12 |