Skip to content

J-MU/database-study

Repository files navigation

📌 학습목표

  • 인덱스의 종류와 동작 원리를 학습하고, 이를 활용해 쿼리를 작성할 수 있다.
  • 실행계획을 읽고 해석해, 적절하게 쿼리를 수정할 수 있다.
  • 쿼리를 보고 실행계획을 예측할 수 있다.





📝 공통 요구사항

  • 데이터베이스는 MySQL을 사용한다.
  • 테스트는 표면 계층만 테스트한다.
  • PR을 올린 후, 실행 계획을 wiki에 작성한다.
  • 논의하고 싶은 내용이 있다면 Discussion에 등록 후, 스터디원들에게 공유한다.





💻 프로그램 실행

build.gradle의 url, user, password 값이 환경 변수로 설정돼 있으며, 해당 값을 등록한 후 프로그램을 실행합니다.

jooq {
    version = "${jooqVersion}"
    configurations {
        sakilaDB {
            generationTool {
                jdbc {
                    driver = "com.mysql.cj.jdbc.Driver"
                    url = System.getenv("DATABASE_URL")
                    user = System.getenv("USERNAME")
                    password = System.getenv("PASSWORD")
                }

    ......





스키마는 src/main/resources/schema 폴더 내부에 있으며, 스키마 등록 후 ./gradlew build 명령어를 실행합니다.

CREATE TABLE IF NOT EXISTS users
(
    id               BIGINT AUTO_INCREMENT PRIMARY KEY                                  NOT NULL COMMENT 'PK',
    country_id       BIGINT                                                             NOT NULL COMMENT '국가 PK',
    `name`           VARCHAR(200) DEFAULT ''                                            NOT NULL COMMENT '이름',
    nickname         VARCHAR(255)                                                       NULL COMMENT '닉네임',
    gender           ENUM ('MAN', 'WOMAN', 'NONE')                                      NULL COMMENT '성별',
    created_at       TIMESTAMP    DEFAULT CURRENT_TIMESTAMP                             NOT NULL COMMENT '생성일',
    last_modified_at TIMESTAMP    DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL COMMENT '최종 수정일',
    deleted          TINYINT(1)   DEFAULT 0                                             NOT NULL COMMENT '삭제 유무'
) ENGINE = 'InnoDB'
  CHARSET = utf8mb4 COMMENT '사용자';

......





Step1.

  • 최근 1년 동안 월별 새로운 사용자 유입 수를 계산하고 이를 내림차순으로 나타낸다.
  • 최근 1년 동안 월별 새로운 사용자 유입을 계산한다. 이때 월별 남성과 여성의 수를 구분하여 표시한다.
  • 활성 사용자 중에서 최근 1년간 서비스를 이용한 적 없는 사용자를 조회한다. 여기서 활성 사용자란 최근 단위 2년 동안 10번 이상 구매 이력이 있는 사용자를 의미한다.
  • 최근 1년 동안 달에 한 번 이상의 구매 이력이 있거나, 10만 원 이상의 구매 이력이 있는 사용자를 조회한다.
  • 최근 3개월 안에 구매 이력이 있는 사람 중에서 최초 구매 이력을 기준으로 가장 오래된 사용자 10명을 조회한다.
  • 재구매율이 5% 이상인 상품을 모두 조회한다. 특정 사용자가 제품을 구매하고 이를 1년 이내에 다시 구매하는 경우 재구매로 인정한다.
  • 한국에서의 연도별 활성 사용자 비율을 조회한다. 여기서 활성 사용자란 최근 단위 시간(2년) 동안 10번 이상 구매 이력이 있는 사용자를 의미한다.
  • 2023년 평균 구매 기간이 10일 이내인 사용자를 모두 출력한다. 구매 기간이란, 특정 사용자가 상품을 구매한 시점 A와 바로 다음 구매 시점 B 사이의 구간 길이를 말한다.
    • 예를 들어 특정 사용자가 2024.09.15에 상품을 구매하고 2024.09.16에 상품을 구매, 2024.09.18에 상품을 또 구매한다면 구매 기간은 각각 1일, 2일이다.
    • 단, 마지막 구매날짜 ~ 현재 날짜도 구매 기간에 포함한다. 현재 날짜를 2024.09.25라고 가정 하면 2024.09.18 이후 구매한 적이 없으므로, 최종 구매 기간은 각각 1일, 2일, 7일이라 볼 수 있고, 평균 구매 기간은 3일(소수점 첫째 자리에서 반올림)로 간주한다.
  • 2023년 평균 구매 기간이 10일 이내인 사용자를 모두 출력한다.
  • 루팡은 2010~2020까지 연도별, VIP 사용자의 변화를 분석하려 한다. 이에 대한 쿼리를 작성한다. VIP유저는 전년도에 1,000만 원 이상을 구매한 사용자를 의미한다.
    • 연도별 VIP 사용자의 수
    • 연도별 작년에 VIP 사용자였다가 강등된 사용자의 수
    • 연도별 작년에 VIP가 아니었다가 새로 VIP 사용자가 된 사용자의 수





Step2.

  • 주문이 많은 사용자 10명을 조회한다
  • 특정 기간 주문량이 가장 많은 사용자 10명을 조회한다.
  • 특정 카테고리에서 주문량이 가장 많은 사용자 10명을 조회한다.
  • 특정 상점에서 특정 기간 주문량이 가장 많은 사용자 10명을 조회한다.
  • 나라별 + 성별별 주문이 가장 많은 카테고리 5개를 조회한다.
  • 사용자 별 몇 번의 주문을 했고, 주문 금액이 얼마인지 계산한다.
  • 카테고리별 판매량의 나라/성별 비율을 조회한다.
  • 국가별 총주문 개수, 금액을 조회한다.
  • 국가별로 연도별 매출 성장 속도를 조회하라.
    • 해당 연도의 매출 성장 속도란 아래와 같이 정의한다.
    • 2018년도의 매출 성장 속도 = 2018년도의 매출 / 2017년도의 매출 *100
  • 연령대별 베스트 셀러 상품이 무엇인지 출력한다.
  • 루팡은 일본에서 사업을 확장하려 했지만, 생각보다 부실한 실적에 고민하고 있다.
    • 루팡은 일본에서 시장 점유율을 늘리기 위해 베스트 셀러 상품에 대해 할인 행사를 진행하고자 한다. 연령대별 베스트 셀러 상품이 무엇인지 출력한다.
    • 여기서 베스트 셀러 상품이란 아래 조건 중 1가지 이상 만족해야 한다. 재 구매율이란 제품을 2회이상 구매한 유저 수 / 제품을 구매한 유저 수 * 100 을 의미한다.
      • 일본에서 판매된 실적 중 판매순위 10위 이내.
      • 일본에서 판매된 실적 중 재구매율 70% 이상.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages