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

여러 테이블을 합쳐서 하나의 결과 테이블을 만들어 내는 것이다

테이블 설계시에는 정규화를 위해 테이블을 나눈다

→ 실제 사용시에는 여러 테이블을 관계 기반으로 합쳐야 한다 (JOIN)

Join 종류들

- inner join
- 두 테이블 사이의 교집합을 보여준다
- left join
- 왼쪽 테이블 전부 보존
- 오른쪽 테이블의 경우 조건이 맞는 경우에만 보존이 된다
- right join
- 오른쪽 테이블 전부 보존
- 왼쪽 테이블의 경우 조건이 맞는 경우에만 보존이 된다
- full outer join
- my sql에서는 지원하지 않는다
- 대신 union으로 만들수는 있다
- 전체 합집합을 의미한다
- cross join
- 해당되는 두 테이블의 모든 조합을 보여준다

트랜잭션이란?

데이터베이스의 상태를 변경시키는 작업의 단위

즉, 한번에 모두 실행이 되거나 실행이 되지 않거나 둘중 하나이다

트랜잭션의 특징

1. atomicity

트랜잭션이 모두 반영이 되거나, 모두 반영이 되지 않거나 둘중 하나다

2. consistency

시스템이 가지는 고정 요소는 트랜잭션으로 바뀌어서는 안된다

3. isolation

두개 이상의 트랜잭션이 동시에 실행될 때, 트랜잭션이 다른 트랜잭션에 개입할 수 없다

4. durability

트랜잭션이 성공한 경우 그 결과가 보존되어야 한다


mysql autocommit

mysql의 경우 autocommit이 기본값이다

따라서 모든 sql 문이 실행되는 즉시 데이터베이스에 반영이 된다

mysql에서 트랜잭션 사용하기

1. START TRANSACTION; or BEGIN ; 명령어로 트랜잭션 시작
2. 이 안에서 여러 SQL 명령문을 실행한다
3. COMMIT; 명령어로 트랜잭션을 완료하거나
ROLLBACK; 명령어로 모든 작업을 취소하고 처음 상태로 되돌린다

트랜잭션 격리

격리 수준에 따른 성능 차이

- 격리 수준이 높을 수록
- 데이터의 일관성은 높아지지만, 성능은 떨어진다(동시성이 낮다)
- 격리 수준이 낮을 때
- 데이터의 일관성이 낮아진다, 성능은 좋아진다(동시성이 높다)

- 격리를 하는 이유는 동시성 문제 때문이다
1. 더티 리드

아직 커밋하지 않아 롤백 될 수 있는 다른 트랜잭션의 변경 데이터를 읽는다

2. 논 리피터블 리드

한 트랜잭션 내에서 다른 트랜잭션이 수정하고 커밋한 데이터를 두번 읽어 결과가 다르게 나오는것

3. 팬텀 리드

한 트랜잭션에서 다른 트랜잭션이 새로운 데이터를 삽입하거나 삭제해서 첫 조회 때와 다른 값의 집합이 나타나는 상황


네가지 격리 수준

- READ UNCOMMITED
- 가장 낮은 격리 수준
- 다른 트랜잭션이 커밋하지 않은 데이터를 읽을 수 있다
- 위에 3가지 문제 모두 발생 가능
- READ COMMITED
- 다른 트랜잭션이 커밋한 데이터만 읽을 수 있다
- 더티 리드만 방지
- REPEATABLE READ
- 한 트랜잭션 안에서는 항상 동일한 데이털르 보장한다
- 더티리드, 팬텀 리드 방지 가능
- SERIALIZABLE
- 가장 엄격한 격리 수준
- 모든 문제를 방지 할 수 있다

Join on 과 where의 차이

- ON
- 테이블을 join하는 기준을 명시한다
- 조인 연산이 **일어나기 전에** 조건을 평가한다
- WHERE
- 조인된 결과에서 최종적으로 필터링할 조건을 명시한다
- 조인 연산이 **모든 끝난 후에** 조건을 평가한다

이둘은 inner join에서는 동일한 결과를 도출하지만 outer join에서는 다른 결과를 만들어낼 수 있다

예시)

students 테이블과 classes 테이블이 있다

1번 on

SELECT *

FROM students s

LEFT JOIN classes c

ON s.student_id = c.student_id

AND c.grade = ‘A’

→ 이 경우 c.grade = ‘A’ 라는 조건을 만족하지 않는 경우 null로 표현이 된다

2번 where

SELECT *

FROM students s

LEFT JOIN classes c

ON s.student_id = c.student_id

WHERE c.grade = ‘A’

→ 이 경우 c.grade = ‘A’ 라는 조건을 만족하지 않는 경우 해당 행 자체가 출력되지 않는다
67 changes: 67 additions & 0 deletions mission/chapter01/mission.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
1. 뷰 작성하는 쿼리,
* 사진의 경우는 일단 배제

review_id는 auto_increment 로 자동 생성

리뷰 작성 날짜는 timestamp를 사용해 자동으로 들어가게 한다

INSERT INTO review (store_id, member_id, rate, explanation)
VALUES (1, 1, 5, '맛있어요!');


2. 마이 페이지 화면 쿼리

마이 페이지에서 해당되는 유저의 정보를 제공한다

SELECT m.name, m.email, m.phone_num

FROM MEMBER m

WHERE m.id = 3



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

해당하는 유저의 미션을 찾는다

이후 해당 미션을 이행하는 가게를 찾는다

SELECT *
FROM (SELECT *

FROM MEMBER_MISSION member_mission

where member_mission.member_id = ?) mem_mission

JOIN MISSION mission

ON mem_mission.mission_id = mission.mission_id

LEFT JOIN STORE store

ON mission.store_id = store.store_id

WHERE mission.status = ‘DONE’

LIMIT 5


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

SELECT m.name, m.price. m.point, m.due_date, s.name, s.category

FROM MISSION m

JOIN STORE s

ON m.store_id = s.store_id

where s.address LIKE ‘%?%’

AND m.status = ‘IN_PROGRESS’

AND m.due_date > = 0

LIMIT 5