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
Binary file added keyword/chapter01/images/join_image.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
71 changes: 71 additions & 0 deletions keyword/chapter01/keyword.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
- DB Join이란?
- 데이터베이스에서 2개 이상의 테이블을 연결하여 데이터를 검색하는 방법
- 분산된 데이터의 효율적 검색 및 통합
- 보통 **PK**혹은 **FK**로 두 테이블을 연결한다. (무조건은 아니다.)
- JOIN을 위해선 적어도 하나의 칼럼은 서로 공유되고 있어야 한다.


- Join 종류들

![image.png](./images/join_image.png)

- **INNER JOIN**
- 교집합
- 기준 테이블과 JOIN 테이블의 중복된 값
- **LEFT JOIN (LEFT OUTER JOIN)**
- JOIN 기준 왼쪽 테이블의 모든 레코드가 SELECT되고, 오른쪽 테이블에서 일치하는 레코드를 반환
- **RIGHT JOIN (RIGHT OUTER JOIN)**
- JOIN 기준 오른쪽의 모든 레코드가 SELECT되고, 왼쪽 테이블에서 일치하는 레커드를 반환
- **FULL JOIN (FULL OUTER JOIN)**
- 양쪽 테이블의 모든 레코드 반환
- 일치하지 않는 경우 NULL로 표시
- **SELF JOIN**
- 테이블이 자기 자신과 조인
- 같은 테이블에 별칭을 두어 사용하여 두 개의 다른 테이블인 것처럼 취급


- 트랜잭션이란?
- 데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위
- 개별적으로 수행되는 것이 아니라 묶어서 연산을 진행하고 싶은 경우에
바로 **트랜잭션을** 사용

**트랜잭션의 특징**

1. 원자성(Atomicty): 전부 성공하거나, 전부 실패
1. 트랜잭션이 DB에 모두 반영되던가, 아니면 전혀 반영되지 않아야 한다.
2. 일관성(Consistency): 트랜잭션 전 후에 DB는 일관된 상태
1. 트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다.
2. 항상 데이터가 우리가 원하는 정의에 일치해야 한다.
3. 격리성(Isolation): 한 트랜잭션 수행 시, 다른 트랜잭션이 끼어들 수 없다
1. 둘 이상의 트랜잭션이 동시에 실행되려고 할 때, 어떤 하나의 트랜잭션이라도 다른 트랜잭션의 연산에 끼어들 수 없다.
2. 적절한 격리수준을 조절하는 것이 중요
4. 지속성(Durablity): 성공한 트랜잭션은 영구적으로 반영
1. 트랜잭션이 성공적으로 완료됐을 경우, 결과는 영구적으로 반영되어야 한다는 속성

**COMMIT과 ROLLBACK**

- COMMIT
- 모든 작업을 정상적으로 처리하겠다고 확정하는 명령어
- 변경된 모든 내용을 영구 저장
- 하나의 트랜잭션 과정 종료
- ROLLBACK
- 트랜잭션 처리 과정에서 생긴 변경 사항을 취소
- 트랜잭션 과정을 종료
- 이전 COMMIT 위치로 복구


- Join on 과 where의 차이점

**핵심 차이점**

- **JOIN ON**: JOIN 전에 조건을 필터링
- **WHERE:** JOIN 후에 조건을 필터링

**공통점**

- INNER JOIN 연산에는 큰 차이가 없다.

**차이점**

- OUTER JOIN시, ON으로 조건을 적용시켜야 OUTER TABLE에 NULL값이 포함된 행들이 반환된다.
- WHERE을 사용했을 때 JOIN의 모든 조건이 끝나고 WHERE로 추가 조건을 걸어준다.
Binary file added mission/chapter01/images/week01.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
79 changes: 79 additions & 0 deletions mission/chapter01/mission.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
### 워크북 캡쳐

![에반_피어리뷰_제이의_워크북.png](./images/에반_피어리뷰_제이의_워크북.png)

### 워크북 리뷰

<aside>

트랜잭션의 개념을 설명함에 있어, 단순히 개념을 나열하는 것이 아니라 두 사람 사이에 5,000원을 입금하는 상황을 예시로 들어 트랜잭션을 사용하는 이유부터 개념에 대한 이해를 돕고자 하는 것이 인상적이었다.

</aside>

### 설계한 DB 사진 (0주차 DB 수정 가능!)

![week01.png](./images/week01.png)

### 본문
1) 리뷰 작성하는 쿼리, 사진의 경우는 일단 배제
```sql
INSERT INTO review (user_id, store_id, score, review_content, created_at, last_modified_at)
VALUES (1, 10, 5, '음 너무 맛있어요 포인트도 얻고 맛있는 맛집도 알게 된 것 같아 너무나도 행복한 식사였답니다. 다음에 또 올게요!!' NOW(), NOW());
```
2) 내가 진행중, 진행 완료한 미션 모아서 보는 쿼리(페이징 포함)
```sql
SELECT m.mission_title, m.mission_point, um.is_completed, um.created_at
FROM user_mission um
JOIN mission m ON um.mission_id = m.mission_id
WHERE um.user_id = 1
ORDER BY um.created_at DESC
LIMIT 10 OFFSET 0;
```
3) 마이 페이지 화면 쿼리
```sql
SELECT user_name, user_address, point
FROM user
WHERE user_id = 1;
```
4) 홈 화면 쿼리(현재 선택 된 지역에서 도전이 가능한 미션 목록, 페이징 포함)
```sql
SELECT s.store_name, m.mission_title, m.mission_point, m.finished_at
FROM mission m
JOIN store s ON m.store_id = s.store_id
WHERE s.store_address LIKE '%안암동%' AND m.is_active = 'TRUE'
ORDER BY m.created_at DESC
LIMIT 15 OFFSET 0;
```

### 미션 기록
1) 리뷰 작성하는 쿼리, 사진의 경우는 일단 배제
<aside>

review 테이블에 사용자가 정한 평점과 리뷰 내용을 insert

생성일자와 수정일자 역시 현재 시각으로 저장해준다.

</aside>

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

user_mission 테이블과 mission 테이블을 조인하여 사용자의 미션 상태와 미션 title을 select

LIMIT으로 한 번에 보여줄 개수를 정하고, OFFSET으로 부하를 조절한다.

</aside>

3) 마이 페이지 화면 쿼리
<aside>

user_id로 사용자의 이름, 주소, 보유 포인트 등 마이 페이지에 들어갈 내용을 SELECT

</aside>

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

store 테이블의 address 컬럼에서 “안암동”을 찾고, is_active가 TRUE인 미션을 SELECT

</aside>