Skip to content

Commit c85cb13

Browse files
authored
[1주차/미키] 워크북 제출합니다
[1주차/미키] 워크북 제출합니다
2 parents 1a15f2c + 03c4a53 commit c85cb13

7 files changed

Lines changed: 235 additions & 1 deletion

File tree

keyword/chapter01/keyword.md

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
- DB Join이란?
2+
3+
여러 테이블에서 데이터를 가져와서 하나의 테이블이나 집합으로 표현하는 것이다.
4+
주로 RDB 에서 많이 쓴다.
5+
6+
- Join 종류들
7+
- Inner join
8+
- join 이라고 부를 때 보통 inner join을 말한다.
9+
- 두 테이블을 조인할 때, 두 테이블에 모두 지정한 열의 데이터가 있어야 한다.
10+
11+
<aside>
12+
💡
13+
14+
```sql
15+
SELECT <열 목록>
16+
FROM <첫 번째 테이블>
17+
INNER JOIN <두 번째 테이블>
18+
ON <조건>
19+
[WHERE 검색 조건]
20+
```
21+
22+
</aside>
23+
24+
- Outer join
25+
- 두 테이블을 조인할 때, 1개의 테이블에만 데이터가 있어도 결과가 나온다.
26+
- 조인하는 테이블의 ON절의 조건 중 한 쪽의 데이터를 모두 가져온다는 의미이다.
27+
- left outer join
28+
- 왼쪽 테이블의 모든 값이 출력되는 조인
29+
- right outer join
30+
- 오른쪽 테이블의 모든 값이 출력되는 조인
31+
- full outer join
32+
- 대부분의 DB는 full outer join을 지원하지 않는다.
33+
- UNION으로 간접적으로 구현하는 방법이 존재한다.
34+
35+
<aside>
36+
💡
37+
38+
```sql
39+
SELECT <열 목록>
40+
FROM <첫 번째 테이블(LEFT 테이블)>
41+
<LEFT | RIGHT | FULL> OUTER JOIN <두 번째 테이블(RIGHT 테이블)>
42+
ON <조인 조건>
43+
[WHERE 검색 조건]
44+
```
45+
46+
</aside>
47+
48+
- Cross join
49+
- 한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인시키는 기능이다.
50+
- 두 테이블 간의 가능한 모든 조합(Cartesian Product)을 생성하는 SQL 조인 방식.
51+
52+
<aside>
53+
💡
54+
55+
```sql
56+
SELECT *
57+
FROM <첫 번째 테이블>
58+
CROSS JOIN <두 번째 테이블>
59+
```
60+
61+
</aside>
62+
63+
- Self join
64+
- 테이블 자기자신을 조인한 것
65+
- 자기자신을 조인하므로 테이블 1개를 사용한다.
66+
67+
<aside>
68+
💡
69+
70+
```sql
71+
SELECT <열 목록>
72+
FROM <테이블> 별칭A
73+
INNER JOIN <테이블> 별칭B
74+
[WHERE 검색 조건]
75+
```
76+
77+
</aside>
78+
79+
- 트랜잭션이란?
80+
- 트랜잭션은 DB에서 작업을 수행하는 단위이다.
81+
- **“모 아니면 도”:** 중간에 작업이 실패하면 처음 상태로 돌아간다. 성공하면 계속 진행한다.
82+
**정상적으로 반영하는 것을 “커밋”
83+
실패해서 되돌리는 것을 “롤백”**
84+
- ACID 원칙
85+
- Atomicity 원자성
86+
- 모두 성공 시에는 커밋을, 실패 시에는 롤백해야 한다.
87+
- 마치 하나의 작업 단위로 움직이는 것처럼 동작한다.
88+
- Consistency 일관성
89+
- 일관성 있는 데이터베이스 상태를 유지해야 한다.
90+
- 무결성 제약 조건을 만족하는 경우를 의미한다.
91+
- Isolatioin 격리성
92+
- 서로 다른 트랜잭션에 영향을 미치지 않도록 한다.
93+
- 동시에 같은 데이터를 수정하지 못하게 한다.
94+
- Durability 영속성
95+
- 트랜잭션이 성공적으로 끝나면 그 결과가 항상 기록되어야 한다.
96+
- 로그를 사용해서 복구할 수 있게 하는 것과 같다.
97+
- Join onwhere의 차이점
98+
- ON
99+
- join 전에 조건을 필터링
100+
- **두 테이블을 합치기 위해 사용하는 규칙**
101+
102+
<aside>
103+
💡
104+
105+
SELECT * FROM 사용자 A
106+
LEFT JOIN 주문 B ON [A.id](http://a.id/) = B.user_id
107+
WHERE B.음식 = '치킨';
108+
109+
- 이런 경우에는 주문이 없는 B 사용자의 데이터는 날아가버린다.
110+
LEFT JOIN은 한 쪽의 데이터가 모두 필요한데 inner join 과 같아져버린다.
111+
</aside>
112+
113+
- WHERE
114+
- join후에 조건을 필터링
115+
- **합치고 나서 필터링**
116+
117+
<aside>
118+
💡
119+
120+
SELECT * FROM 사용자 A
121+
LEFT JOIN 주문 B ON [A.id](http://a.id/) = B.user_id AND B.음식 = '치킨';
122+
123+
- 필터링 조건을 on 에 넣으면 사용자A 와 치킨 주문은 잘 조인되고
124+
사용자 B는 주문은 없지만 LEFT JOIN 의 특성 때문에 NULL 결과를 가지고 조인된다.
125+
</aside>

mission/chapter00/img_3.png

392 KB
Loading

mission/chapter00/img_4.png

439 KB
Loading

mission/chapter00/img_5.png

446 KB
Loading

mission/chapter00/mission.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,17 @@
66
<aside>
77
🌟
88

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

12+
1113
</aside>
1214

1315
- **미션 기록**
1416

1517
ERD 사진
1618

17-
![img_1.png](img_1.png)
19+
![img_5.png](img_5.png)
1820
설명
1921

2022
<aside>

mission/chapter01/img.png

93.8 KB
Loading

mission/chapter01/mission.md

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
- 피어리뷰(Spring 1팀 빈)
2+
### 워크북 캡쳐
3+
4+
![img.png](img.png)
5+
6+
### 워크북 리뷰
7+
8+
<aside>
9+
🌟
10+
11+
on과 where의 차이가 단지 조건이라고 생각했는데, 실제 사용할 때 어떤 식으로 하는 지 쉬운 말로 풀어서 이해하기 좋았다.
12+
13+
</aside>
14+
15+
- **미션 기록**
16+
17+
### 1번 리뷰 작성하는 쿼리
18+
19+
쿼리문
20+
21+
필요한 데이터 분류:
22+
- 평점, 내용, 생성일자를 사용자가 남긴 리뷰 DB에 넣어준다.
23+
- INSERT INTO review(score, text, user_id, store_id, created_at, updated_at)
24+
VALUES(5, '음 맛있다', 1, 1, NOW(), NOW());
25+
- 설명: INSERT 쿼리를 사용해서 이름, 평점, 생성일자, 내용, 사진 등을 DB에 삽입한다.
26+
### 2번 마이 페이지 화면 쿼리
27+
28+
- 필요한 데이터 분류:
29+
사용자 테이블에서 이름, 메일, 번호, 포인트 가 필요하다.
30+
- SELECT name, email, phone_number, user_point
31+
FROM user
32+
WHERE id = 1
33+
설명: 내가 설계했던 DB에는 메일과 번호 데이터가 없어서 ERD에 새로운 컬럼을 생성했다.
34+
35+
### 3번 내가 진행중, 진행 완료한 미션 모아서 보는 쿼리
36+
(페이징 포함)
37+
38+
쿼리문
39+
40+
- 필요한 데이터 분류:
41+
- 사용자 미션 테이블과 미션 테이블을 조인해서 사용
42+
- 수행상태
43+
- 쿼리문:
44+
SELECT m.mission_point AS reward_point,
45+
um.status AS mission_status,
46+
s.name AS store_name,
47+
m.content AS mission_content,
48+
um.id AS cursor_id
49+
FROM user_mission um
50+
JOIN mission m ON m.id = um.mission_id
51+
JOIN store s ON s.id = m.store_id
52+
WHERE user_id = 1
53+
AND um.status = 'success'
54+
AND um.deleted_at IS NULL
55+
AND um.id < 25
56+
ORDER BY um.id desc
57+
LIMIT 10
58+
- 설명: 사용자 미션 테이블에서 미션 테이블을 조인하고, 미션 테이블에서
59+
미션 테이블과 가게 테이블을 조인하여 사용했다.
60+
id를 커서를 두고 커서 기반 페이징을 사용했다.
61+
실제로는 25 자리에 프론트가 보내준 마지막 커서가 들어간다.
62+
63+
64+
65+
### 4번 홈 화면 쿼리
66+
(현재 선택 된 지역에서 도전이 가능한 미션 목록, 페이징 포함)
67+
68+
쿼리문
69+
70+
- 필요한 데이터 분류:
71+
- 상단: 주소와 사용자 포인트
72+
- 프로그레스 바: 미션 완료 횟수
73+
- 하단 리스트: 사용자 미션 테이블
74+
- 쿼리문
75+
- 상단:
76+
SELECT address, user_point
77+
FROM user
78+
WHERE id = 1 AND deleted_at = IS NULL;
79+
80+
- 프로그레스 바:
81+
SELECT COUNT(id) AS mission_completion
82+
FROM user_mission
83+
WHERE user_id = 1
84+
AND status = “success”
85+
AND deleted_at IS NULL;
86+
87+
- 하단: SELECT s.name AS store_name,
88+
s.category AS store_category,
89+
DATEDIFF(m.mission_time, CURRENT_DATE()) AS d_day,
90+
m.content AS missoin_content,
91+
m.mission_point AS reward_point
92+
FROM mission m
93+
JOIN store s ON m.store_id = s.id
94+
JOIN region r ON s.region_id = r.id
95+
WHERE r.name = '안암동'
96+
AND m.id NOT IN(
97+
SELECT mission_id
98+
FROM user_mission
99+
WHERE user_id = 1
100+
)
101+
ORDER BY m.mission_time ASC
102+
LIMIT 10 OFFSET 10
103+
104+
-설명: 상단에는 사용자 테이블에서 주소와 사용자 포인트를 조회한다.
105+
프로그레스 바에서 사용자 미션에서 수행상태가 완료인 사용자 미션 개수를 센다.
106+
지역 테이블과 가게 테이블을 조인하여 지역 필터링을 진행한다.
107+
미션을 가져올 때 이미 사용자 미션에 있는 미션들은 가져오지 않는 서브쿼리를 작성한다.

0 commit comments

Comments
 (0)