Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 73 additions & 0 deletions keyword/chapter01/keyword.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
- DB Join이란?

### DB Join

관계형 데이터 베이스에서 두 개 이상의 테이블을 연결하여 하나의 결과 테이블로 만드는 기능

- 연결하려면 테이블들은 최소 하나의 속성을 공유하고 있어야 한다
- 여러 테이블에 흩어져 있는 데이터를 조합해서 볼 때 사용
- Join 종류들

### INNER JOIN

- 두 테이블 모두 존재하는 (공통된) 값을 가지고 있는 행들을 반환한다
- 교집합

### OUTER JOIN

**LEFT OUTER JOIN (LEFT JOIN)**

- 왼쪽 테이블의 모든 데이터를 유지하고 오른쪽 테이블에서는 왼쪽 테이블과 일치하는 데이터 값만 붙인다 일치하는게 없다면 NULL

**RIGHT OUTER JOIN (RIGHT JOIN)**

- 왼쪽 테이블의 모든 데이터를 유지하고 오른쪽 테이블에서는 왼쪽 테이블과 일치하는 데이터 값만 붙인다 일치하는게 없다면 NULL

**FULL OUTER JOIN**

- 양쪽 테이블의 모든 데이터를 합집합해서 반환
- 공통된 값이 없다면 NULL
- MySQL에서는 지원하지 않아서 LEFT JOIN과 RIGHT JOIN을 UNION해서 사용한다

### **CROSS JOIN**

- 두 테이블 간에 가능한 모든 경우의 수를 반환한다
- = 한 쪽 테이블의 행과 다른 쪽 테이블의 모든 행을 조인
- 나오는 전체 행의 개수는 조인하는 두 테이블의 행의 개수를 각각 곱한 수

- 트랜잭션이란?

### 트랜잭션

데이터 베이스에서 하나의 작업 단위

- 여러 SQL 작업이 실행될 때 하나라도 실패한다면 나머지 전부도 같이 실패하게 만들어서 데이터의 무결성을 보장한다
- COMMIT : 모든 작업이 정상적으로 끝났으니 DB에 저장
- ROLLBACK : 작업 도중 문제가 발생해 현재 작업들 모두 취소
- **트랜잭션의 4가지 특징 → ACID**
- 원자성 Atomicity
- 작업이 하나라도 실패하면 나머지 모두 취소
- 트랜잭션 내의 작업은 모두 성공하거나 모두 실패
- 중간에 에러 발생하면 → ROOLBACK → 전부 취소됨
- 일관성 Consistency
- 트랜잭션 전후로 데이터베이스의 제약 조건이나 규칙이 항상 일관되게 유지되어야 한다
- 고립성 Isolation
- 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 격리되어야 한다
- 영속성 Durability
- 성공적으로 완료된(COMMIT된) 트랜잭션의 결과는 무조건 저장이 되어야 한다
- 영구적으로 보존
- Join on 과 where의 차이점

join 과정에서 데이터 필터링이 적용되는 시점의 차이가 있다

### ON

- **조인 전 조건 필터링:** 테이블을 합치기 **전**에 어떤 기준으로 데이터를 이어 붙일지 결정
- **기준 데이터 보존:** LEFT JOIN 등에서 기준이 되는 테이블(왼쪽)의 데이터 행을 무조건 살려두고 싶을 때 핵심 역할
- 두 테이블의 데이터를 합칠 때 짝을 지어주는 연결 고리 조건

### **WHERE**

- **조인 후 조건 필터링:** 테이블 조인이 모두 끝난 **후**에, 임시로 완성된 결과물에서 데이터를 걸러냅니다.
- **결과물 정제:** 조인 방식과 상관없이 최종 결과 테이블에서 조건에 안 맞는 행은 모두 잘라냅니다
- 다 합쳐진 덩어리 중에서 내가 최종적으로 화면에 보여줄 진짜 데이터만 추려내는 조건
Binary file added mission/chapter01/ERD.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
109 changes: 109 additions & 0 deletions mission/chapter01/mission.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
### 피어리뷰 (Spring A팀 레오)

### 워크북 리뷰
![워크북 캡쳐](워크북캡쳐.png)

### 워크북 리뷰
<aside>
🌟

조인의 종류 중에서 self join 이라는 것이 있는지 몰랐어서 키워드 정리에 작성하지 못했는데 레오의 워크북을 보고 내가 몰랐던 부분을 알 수 있어서 좋았습니다

</aside>

###리뷰 작성하는 쿼리

쿼리문

<aside>

데이터 값들을 받아서 review 테이블에 insert로 넣어준다

INSERT INTO review ( content, rate, created_at, user_id, shop_id) VALUES (’음 너무 맛있어요…’, 5, now(), 1, 1);

</aside>


###마이 페이지 화면 쿼리

쿼리문

<aside>

사용자의 이름, 메일, 전화번호, 포인트의 정보가 필요하므로 그 데이터를 유저 테이블에서 가지고 온다

휴대폰 번호가 null인 경우 미인증 상태인 것이다

SELECT name, mail, phone_number, point

FROM user
WHERE id = 1;

</aside>


###내가 진행중, 진행 완료한 미션 모아서 보는 쿼리(페이징 포함)

쿼리문

<aside>

가게이름, 성공 여부, 조건 금액, 제공 포인트, 성공 여부가 필요하므로 미션 테이블, 가게 테이블, 사용자 미션 테이블들을 join해서 데이터를 가져와야 한다

SELECT s. id, s.name, m.content, m.point, um.is_completed

FROM mission m

JOIN user_mission um ON m.id = um.mission_id

JOIN shop s ON m.shop_id = s.id

WHERE um.user_id = 1 AND um.state = ‘complete’ AND um.id<90

ORDER BY m.id desc
LIMIT 10;

마지막으로 조회한 um.id가 90일때 그걸 커서로 두고 커서 기반 페이징함
그리고 가게 id는 리뷰 작성할 때 맞는 가게로 찾아 가기 위해 가지고 옴

</aside>


###홈 화면 쿼리
(현재 선택 된 지역에서 도전이 가능한 미션 목록, 페이징 포함)

쿼리문

<aside>

사용자의 미션 중에서 달성한 미션의 개수 → count를 사용해서 user_mission 테이블에서 성공한 미션의 개수를 센다
지역, 가게 이름, 가게 유형, 조건 금액, 제공 포인트, 종료 날짜가 필요 → 지역 테이블, 사용자 미션 테이블, 미션 테이블, 가게 테이블을 JOIN해서 아직 성공 전인 미션 관련 데이터를 가지고 온다

<<사용자 달성 미션 개수>>

SELECT count(*)

FROM user_mission um

JOIN mission m ON um.mission_id = m.id

JOIN shop s ON m.shop_id = s.id
JOIN region r ON s.region_id = r.id

WHERE user_id=1 AND is_completed=true AND r.name = ‘안암동’

지역 데이터를 포함하기 위해서 shop 테이블도 조인

<<MY MISSION>>

SELECT s.id, s.name, s.category, m.content, m.point, m.due_date
FROM mission m
JOIN user_mission um ON m.id = um.mission_id
JOIN shop s ON m.shop_id = s.id
WHERE um.user_id = 1 AND um.is_completed = false AND um.id<90
ORDER BY m.id desc
LIMIT 10;

커서 기반 페이징

</aside>
Binary file added mission/chapter01/워크북캡쳐.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.