posts 테이블에 user id가 있는 이유는 join을 위한 것! -> user 테이블에 post id가 없는 이유는, 1대다 관계에서 '다'에 해당되지 않아서. 1대 다 에서 '다'에 해당되는 부분만 fk를 가지기에.
users 와 posts 테이블은 1대 다 관계 -> 하나의 user는 여러 post를 쓸 수 있지만, 하나의 posts는 하나의 유저만 가지니까
users 테이블에 'post id'는 없지만, 'review id'는 가질 수 있음! -> users가 '다' , review가 1 이기 때문에 가능! users 와 posts 테이블에서는 'users와 posts 가 일대다'라서 post id를 못 가지지만, users 와 review 테이블에서는 'users와 review 가 다대일'이라서 review id는 가질 수 있음!
users 와 review 테이블도 1대다 관계 -> 하나의 review 는 하나의 유저만 가지지만, 하나의 유저는 여러 리뷰를 가지기에, 1대다니까 가능!
INNER JOIN키워드를 사용해서 내부결합
INNER JOIN으로, users 테이블과 posts 테이블을,user_id 기준으로 결합
post.user_id= users.id
* 왼쪽엔 Post 테이블의 id, title, user_id, content
* 오른쪽엔 user 테이블의 id, name
* 기준은 user_id (post 테이블의 user_id , user 테이블의 id// post 테이블의 user_id는 fk 외래키 --> 연결하기 위한)
mysql> SELECT
posts.id,
posts.title,
posts.user_id,
posts.content
users.id,
users.name
FROM posts
INNER JOIN users ON posts.user_id = users.id;
+----+--------------+---------+----------------------------+----+-----------------+
| id | title | user_id | content | id | name |
+----+--------------+---------+----------------------------+----+-----------------+
| 1 | 위코드 1일차 | 1 | HTML과 CSS 익숙해지기.. | 1 | Rebekah Johnson |
| 2 | 위코드 2일차 | 1 | Javascript 기본 문법 학습.. | 1 | Rebekah Johnson |
| 3 | 위코드 3일차 | 1 | 웹서비스의 역사와 발전 세션을 듣고.| 1 | Rebekah Johnson |
| 5 | 자료구조 1번 | 2 | BigO Notation이란 무엇인가? | 2 | Fabian Predovic |
| 6 | 자료구조 2번 | 2 | 시간 복잡도와 공간 복잡도에 대해서.| 2 | Fabian Predovic |
| 7 | 프론트 개발 입문 | 3 | 프론트 입문 HTML이란 무엇인가? | 3 | Elenor Gottlieb |
+----+--------------+---------+----------------------------+----+-----------------+
Outer Join 외부 결합: Left Join, Right Join, Full Join
일단 select ~ FROM users LEFT/RIGHT JOIN ~ ON ~
에서 select이후에는, 어떤 칼럼들이 올지 순서대로 읽으면 되고 (가볍게 패스)
FROM users 로 어느 테이블이 기준인지!
LEFT/RIGHT: 왼쪽에서 시작인지, 오른쪽에서 시작인지! 생각
그리고 ON 이후엔 조건을 보면 됨
결합(Join)하는 여러테이블에서 한 쪽에는 데이터가 있고, 한 쪽에는 데이터가 없는 경우, 데이터가 있는 쪽 테이블을 기준으로 모두 출력하는 결합 방법
기준이되는 테이블 (left table)의 모든 row와 join이 걸리는 테이블(right table) 중에서left table과 매칭되는 row만 검색
(사진 기준) left join: left/왼쪽에 있는 user table을 기준으로 user에 있는 모든 값을 다 찍어내겠다 right의 Posts 테이블에 left에 해당되는 user table의 값 name4에 해당되는 user_id= 4가 post table에 없더라도, left join 으로 left 기준이니까, 찍어내겠다.
right join: right/오른쪽에 있는 posts table을 기준으로 posts 에 있는 모든 값을 다 찍어내겠다 right의 Posts 테이블에 left에 해당되는 user table의 값에 없더라도, right join 으로 right 기준이니까, 찍어내겠다.
* 만약, left에 posts테이블에 있으면 left join이 posts 테이블 기준임.
유동적으로 옮겨질 수 있음.
* inner join 은 교집합
* outer join은 합집합
합집합 중에서도
- left join은 left를 기준으로 left에 있는 것만 합 (left가 열이 3개면, right는 열이 4개면 -> join 결과는 3줄 )
- right join은 right을 기준으로 (left가 열이 3개면, right는 열이 4개면 -> join 결과는 4줄 )
--> select는 가져와야 해서 join할 때 가져오는 거
목록페이지에서 '정렬'
1. order by -> rating/ high price/ 등등으로 정렬하겠다
2. left join으로 product에 color, option등등 테이블을 옆에 갖다 붙여준다.
left right 중에 뭘 할지 정하는 기준은, ? 기준점으로 붙이니까, 그냥 내가 정하기 나름
(right join을 쓸 일이 없음, 왼쪽 기준으로 옆으로 붙이니 left join 자랑)
3. 그 후에 다 붙인거를 한번에
마지막에, 옆에 붙여준거를 group by - 타입이 같은 데이터 끼리 갖다 붙였으니 하나로 묶어준다 -> 정렬이 다양한