Skip to content
Merged
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
125 changes: 125 additions & 0 deletions keyword/chapter01/keyword.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
- DB Join이란?

여러 테이블에서 데이터를 가져와서 하나의 테이블이나 집합으로 표현하는 것이다.
주로 RDB 에서 많이 쓴다.

- Join 종류들
- Inner join
- join 이라고 부를 때 보통 inner join을 말한다.
- 두 테이블을 조인할 때, 두 테이블에 모두 지정한 열의 데이터가 있어야 한다.

<aside>
💡

```sql
SELECT <열 목록>
FROM <첫 번째 테이블>
INNER JOIN <두 번째 테이블>
ON <조건>
[WHERE 검색 조건]
```

</aside>

- Outer join
- 두 테이블을 조인할 때, 1개의 테이블에만 데이터가 있어도 결과가 나온다.
- 조인하는 테이블의 ON절의 조건 중 한 쪽의 데이터를 모두 가져온다는 의미이다.
- left outer join
- 왼쪽 테이블의 모든 값이 출력되는 조인
- right outer join
- 오른쪽 테이블의 모든 값이 출력되는 조인
- full outer join
- 대부분의 DB는 full outer join을 지원하지 않는다.
- UNION으로 간접적으로 구현하는 방법이 존재한다.

<aside>
💡

```sql
SELECT <열 목록>
FROM <첫 번째 테이블(LEFT 테이블)>
<LEFT | RIGHT | FULL> OUTER JOIN <두 번째 테이블(RIGHT 테이블)>
ON <조인 조건>
[WHERE 검색 조건]
```

</aside>

- Cross join
- 한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인시키는 기능이다.
- 두 테이블 간의 가능한 모든 조합(Cartesian Product)을 생성하는 SQL 조인 방식.

<aside>
💡

```sql
SELECT *
FROM <첫 번째 테이블>
CROSS JOIN <두 번째 테이블>
```

</aside>

- Self join
- 테이블 자기자신을 조인한 것
- 자기자신을 조인하므로 테이블 1개를 사용한다.

<aside>
💡

```sql
SELECT <열 목록>
FROM <테이블> 별칭A
INNER JOIN <테이블> 별칭B
[WHERE 검색 조건]
```

</aside>

- 트랜잭션이란?
- 트랜잭션은 DB에서 작업을 수행하는 단위이다.
- **“모 아니면 도”:** 중간에 작업이 실패하면 처음 상태로 돌아간다. 성공하면 계속 진행한다.
**정상적으로 반영하는 것을 “커밋”
실패해서 되돌리는 것을 “롤백”**
- ACID 원칙
- Atomicity 원자성
- 모두 성공 시에는 커밋을, 실패 시에는 롤백해야 한다.
- 마치 하나의 작업 단위로 움직이는 것처럼 동작한다.
- Consistency 일관성
- 일관성 있는 데이터베이스 상태를 유지해야 한다.
- 무결성 제약 조건을 만족하는 경우를 의미한다.
- Isolatioin 격리성
- 서로 다른 트랜잭션에 영향을 미치지 않도록 한다.
- 동시에 같은 데이터를 수정하지 못하게 한다.
- Durability 영속성
- 트랜잭션이 성공적으로 끝나면 그 결과가 항상 기록되어야 한다.
- 로그를 사용해서 복구할 수 있게 하는 것과 같다.
- Join on 과 where의 차이점
- ON
- join 전에 조건을 필터링
- **두 테이블을 합치기 위해 사용하는 규칙**

<aside>
💡

SELECT * FROM 사용자 A
LEFT JOIN 주문 B ON [A.id](http://a.id/) = B.user_id
WHERE B.음식 = '치킨';

- 이런 경우에는 주문이 없는 B 사용자의 데이터는 날아가버린다.
LEFT JOIN은 한 쪽의 데이터가 모두 필요한데 inner join 과 같아져버린다.
</aside>

- WHERE
- join후에 조건을 필터링
- **합치고 나서 필터링**

<aside>
💡

SELECT * FROM 사용자 A
LEFT JOIN 주문 B ON [A.id](http://a.id/) = B.user_id AND B.음식 = '치킨';

- 필터링 조건을 on 에 넣으면 사용자A 와 치킨 주문은 잘 조인되고
사용자 B는 주문은 없지만 LEFT JOIN 의 특성 때문에 NULL 결과를 가지고 조인된다.
</aside>
Binary file added mission/chapter00/img_3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added mission/chapter00/img_4.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added mission/chapter00/img_5.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 3 additions & 1 deletion mission/chapter00/mission.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,17 @@
<aside>
🌟

<"빈"의 워크북>
정규화 과정이 이론을 텍스트로 보면 정말 헷갈리기 쉬운데, 이렇게 예시를 들어서 표로 제작해서 볼 수 있으니 이해가 쉽습니다. 예시를 설명할 수 있을 정도로 깊은 학습을 하신 부분이 인상적입니다!


</aside>

- **미션 기록**

ERD 사진

![img_1.png](img_1.png)
![img_5.png](img_5.png)
설명

<aside>
Expand Down
Binary file added mission/chapter01/img.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
107 changes: 107 additions & 0 deletions mission/chapter01/mission.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
- 피어리뷰(Spring 1팀 빈)
### 워크북 캡쳐

![img.png](img.png)

### 워크북 리뷰

<aside>
🌟

on과 where의 차이가 단지 조건이라고 생각했는데, 실제 사용할 때 어떤 식으로 하는 지 쉬운 말로 풀어서 이해하기 좋았다.

</aside>

- **미션 기록**

### 1번 리뷰 작성하는 쿼리

쿼리문

필요한 데이터 분류:
- 평점, 내용, 생성일자를 사용자가 남긴 리뷰 DB에 넣어준다.
- INSERT INTO review(score, text, user_id, store_id, created_at, updated_at)
VALUES(5, '음 맛있다', 1, 1, NOW(), NOW());
- 설명: INSERT 쿼리를 사용해서 이름, 평점, 생성일자, 내용, 사진 등을 DB에 삽입한다.
### 2번 마이 페이지 화면 쿼리

- 필요한 데이터 분류:
사용자 테이블에서 이름, 메일, 번호, 포인트 가 필요하다.
- SELECT name, email, phone_number, user_point
FROM user
WHERE id = 1
설명: 내가 설계했던 DB에는 메일과 번호 데이터가 없어서 ERD에 새로운 컬럼을 생성했다.

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

쿼리문

- 필요한 데이터 분류:
- 사용자 미션 테이블과 미션 테이블을 조인해서 사용
- 수행상태
- 쿼리문:
SELECT m.mission_point AS reward_point,

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저는 AS가 테이블 이름을 짧게 줄이는 기능만 있는줄 알았는데 별칭 기능도 있었군요!

um.status AS mission_status,
s.name AS store_name,
m.content AS mission_content,
um.id AS cursor_id
FROM user_mission um
JOIN mission m ON m.id = um.mission_id

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

제가 알기로는 SELECT, FROM, JOIN 모든 곳에서 AS 사용해도 되는 것으로 알고 있어서 mission AS m이 맞을 것 같아요!

JOIN store s ON s.id = m.store_id
WHERE user_id = 1
AND um.status = 'success'
AND um.deleted_at IS NULL
AND um.id < 25

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cursor paging 방법까지 쓰신게 인상깊어요!

ORDER BY um.id desc
LIMIT 10
- 설명: 사용자 미션 테이블에서 미션 테이블을 조인하고, 미션 테이블에서
미션 테이블과 가게 테이블을 조인하여 사용했다.
id를 커서를 두고 커서 기반 페이징을 사용했다.
실제로는 25 자리에 프론트가 보내준 마지막 커서가 들어간다.



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

쿼리문

- 필요한 데이터 분류:
- 상단: 주소와 사용자 포인트
- 프로그레스 바: 미션 완료 횟수
- 하단 리스트: 사용자 미션 테이블
- 쿼리문
- 상단:
SELECT address, user_point
FROM user
WHERE id = 1 AND deleted_at = IS NULL;

- 프로그레스 바:
SELECT COUNT(id) AS mission_completion
FROM user_mission
WHERE user_id = 1
AND status = “success”
AND deleted_at IS NULL;

- 하단: SELECT s.name AS store_name,
s.category AS store_category,
DATEDIFF(m.mission_time, CURRENT_DATE()) AS d_day,

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

created_at()을 front에 넘기는게 아니라 직접 시간 넘겨주는게 멋있어요!

m.content AS missoin_content,
m.mission_point AS reward_point
FROM mission m
JOIN store s ON m.store_id = s.id
JOIN region r ON s.region_id = r.id
WHERE r.name = '안암동'
AND m.id NOT IN(
SELECT mission_id
FROM user_mission
WHERE user_id = 1
)
ORDER BY m.mission_time ASC
LIMIT 10 OFFSET 10

-설명: 상단에는 사용자 테이블에서 주소와 사용자 포인트를 조회한다.
프로그레스 바에서 사용자 미션에서 수행상태가 완료인 사용자 미션 개수를 센다.
지역 테이블과 가게 테이블을 조인하여 지역 필터링을 진행한다.
미션을 가져올 때 이미 사용자 미션에 있는 미션들은 가져오지 않는 서브쿼리를 작성한다.