diff --git a/keyword/chapter01/keyword.md b/keyword/chapter01/keyword.md new file mode 100644 index 0000000..60b1755 --- /dev/null +++ b/keyword/chapter01/keyword.md @@ -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’ 라는 조건을 만족하지 않는 경우 해당 행 자체가 출력되지 않는다 \ No newline at end of file diff --git a/mission/chapter01/mission.md b/mission/chapter01/mission.md new file mode 100644 index 0000000..ddbcad0 --- /dev/null +++ b/mission/chapter01/mission.md @@ -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 \ No newline at end of file