4일차

Suhyeon Lee·2024년 10월 4일
0

CodeKata

SQL

40. 루시와 엘라 찾기

  • 작성 코드
SELECT
  animal_id
  , name
  , sex_upon_intake
FROM
  animal_ins
WHERE
  name IN('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty')
;
  • 아이디 순으로 조회해 주세요 조건이 예시에 적어저 있어서 쿼리에 구현을 못했다...

    • 그런데 정답처리는 되었는데?
      • ANIMAL_INS가 아이디 순으로 들어가 있었기 때문임
      • 다음부터는 조건 놓치지 말기(꼭 끝까지 읽고 작성하자)
  • REGEXP를 이용한 풀이

    SELECT
      animal_id
      , name
      , sex_upon_intake
    FROM
      animal_ins
    WHERE
      name REGEXP '\\bLucy\\b|\\bElla\\b|\\bPickle\\b|\\bRogan\\b|\\bSabrina\\b|\\bMitty\\b'
    ORDER BY
      animal_id
    ;
    • REGEXP 'Lucy|Ella|Pickle|Rogan|Sabrina|Mitty'로 쓰면 틀린 답이라고 나옴
      • 정규식 검색의 특징 때문
  • REGEXP

    • REGEXP는 문자열 내부에 어떤 부분이든 해당 정규식이 존재한다면 True로 처리
      • 따라서 i'm not Lucy 라는 이름을 가진 동물이 있다면 통과됨
    • REGEXP 동작 방식 LIKE로 설명하면 아래와 같음
      SELECT
        animal_id
        , name
        , sex_upon_intake
      FROM
        animal_ins
      WHERE
        name
          LIKE '%Lucy%' OR
        name
          LIKE '%Ella%' OR
        name
          LIKE '%Pickle%' OR
          name
          LIKE '%Rogan%' OR
        name
          LIKE '%Sabrina%' OR
        name
          LIKE '%Mitty%'
      ORDER BY
        animal_id
      ;
    • 따라서 정확하게 단어 패턴을 매칭하려면(정확하게 일치하려면) 단어경계(\b) 사용하거나 아래와 같이 시작과 끝 표시해주기
      SELECT
        animal_id
        , name
        , sex_upon_intake
      FROM
        animal_ins 
      WHERE
        name
          REGEXP "^(Lucy|Ella|Pickle|Rogan|Sabrina|Mitty)$"
      ORDER BY
        animal_id
      ;

32. 카테고리별 도서 판매량 집계하기

  • 작성 코드
SELECT
 b.category
 , SUM(bs.sales) AS TOTAL_SALES
FROM
  book_sales bs JOIN book b USING (book_id)
WHERE
  DATE_FORMAT(bs.sales_date, '%Y-%m') = '2022-01'
GROUP BY
  b.category
ORDER BY
  b.category
;
  • 조건 잘 확인하기!

    • 2022년 1월
    • 카테고리 별 총 도서 판매량
      • GROUP BY
      • 총 판매량은 total_sales로 명명
    • 결과는 카테고리명을 기준으로 오름차순 정렬
  • WHERE절을 WHERE SALES_DATE LIKE '2022-01%로 처리해도 된다고 함

  • WITH을 사용해 푼 분도 있었음

    WITH TEMP AS (
                 SELECT BOOK_ID,SALES
                    , DATE_FORMAT(SALES_DATE, '%Y-%m') AS SALES_DATE
                 FROM BOOK_SALES 
                 WHERE DATE_FORMAT(SALES_DATE, '%Y-%m') = "2022-01"
                )
    SELECT A.CATEGORY, SUM(B.SALES) AS TOTAL_SALES
    FROM BOOK A 
    INNER JOIN TEMP B ON A.BOOK_ID = B.BOOK_ID
    GROUP BY A.CATEGORY 
    ORDER BY 1
  • 서브쿼리 사용한 케이스

    SELECT CATEGORY, SUM(TOTAL_SALES) TOTAL_SALES
    FROM (
        SELECT *, SUM(SALES) TOTAL_SALES
        FROM BOOK_SALES
        WHERE YEAR(SALES_DATE) = 2022 AND MONTH(SALES_DATE) = 1
        GROUP BY BOOK_ID
    ) SUB
    NATURAL JOIN BOOK
    GROUP BY CATEGORY
    ORDER BY 1;  
  • WHERE절에서 처리

    SELECT DISTINCT A.CATEGORY
        , SUM(B.SALES) OVER (PARTITION BY A.CATEGORY) AS TOTAL_SALES
    FROM BOOK A
    JOIN BOOK_SALES B
        ON A.BOOK_ID = B.BOOK_ID
    WHERE YEAR(B.SALES_DATE) = '2022'
        AND MONTH(B.SALES_DATE) = '1'
    ORDER BY A.CATEGORY ASC;
    • 참고하면 좋을 또 다른 풀이
      SELECT
        b.category
        , SUM(bs.sales) AS total_sales
      FROM
        book b
          LEFT JOIN book_sales bs
            ON b.book_id = bs.book_id
      WHERE
        bs.sales_date
          BETWEEN STR_TO_DATE('2022-01-01','%Y-%m-%d')
            AND STR_TO_DATE('2022-01-31','%Y-%m-%d')
      GROUP BY
        b.category
      ORDER BY
        b.category
      형변환과 인덱스



오전 스크럼

알아두면 좋은 정보

  • BA쪽 생각한다면 M&A 자문, M&A 전략 수립, IPO 공부해 두면 좋다고 함
  • 프로젝트 매니저 생각 있으면 PMP 자격증 추천



온라인 강의

ADsP 자격증 챌린지 2주차



아티클 스터디

SQL 질문 잘 하는 방법

아티클 요약 및 주요 내용

  • 요약 : 아티클의 핵심 내용을 요약
    • 다른 사람한테 "잘" 물어보는 방법
      1. 질문 전 확인해야 할 것
      • 오탈자, 에러메시지 내용, 문제 요구 조건, 선택된 DBMS, 쿼리 실행해 본 거 맞는지
      1. 인터넷에 먼저 검색해보기
      • 구글에 영어로 검색
      • 검색 키워드 잘 쓰기: 검색 쿼리의 범위 좁히기
      • 신뢰할 수 있는 사이트의 내용 위주로 확인: 공식 문서, 스택 오버플로우
      • 글 작성 날짜 확인하기: 내가 쓰는 버전과 다르면 풀이가 다를 수 있음
      1. 팀원, 동료, 튜터님께 질문
      • 질문 템플릿을 활용하면 좋음
      • 모호하게 질문하지 않고 의도를 명확하게 해서 질문하기
    • 무엇보다도 포기하지 않고 스스로 끝까지 해보는 것이 중요

      SQL은 다른 프로그래밍 언어나 프레임워크에 비해 발전이 매우 빠르지는 않고 표준이 정해져있어 최신 문서만 봐야 할 필요까지는 없지만, DBMS의 특정 버전 이후에서만 사용할 수 있는 함수가 있다던지 하는 시기가 중요한 정보도 분명히 있습니다.
      예를 들어, MySQL은 2018년에 릴리즈한 8.0 버전부터 윈도우 함수를 지원하기 시작했기 때문에 ‘mysql cumulative sum(MySQL로 누적합 구하기)’를 검색해 2018년 이전 자료들만 살펴본다면 윈도우 함수가 아닌 서브쿼리를 이용한 풀이만 보게 될 확률이 높습니다.
      검색결과의 꽤 상단에 stackoverflow에 2010년에 올라온 질문(링크)이 있죠. 들어가서 살펴보면 서브쿼리로 누적합을 구하는 답변이 가장 상단에 있습니다. MySQL 8.0 버전 이상을 쓰고 있다면 누적합은 서브쿼리로 계산하는 것보다 윈도우 함수로 계산하는 것이 훨씬 빠른데, 이 링크에 있는 정보만 보고 SQL을 작성하면 서브 쿼리로 작성을 하고 있겠죠. SQL에 대해서 검색을 할 때에도 정보의 최신성을 생각해야 하는 이유입니다.

  • 주요 포인트 : 아티클에서 강조하는 주요 포인트 파악
    • 성장하기 위해서는 질문을 잘 해야 함
    • 계속 시도하고 실패하는 과정에서 많은 것을 배울 수 있음

핵심 개념 및 용어 정리

  • 핵심 개념: 아티클에서 언급된 중요한 개념 정리
    • 검색 키워드
      • 코드를 쉽게 작성하여 읽기 쉽게 유지하는 것
      • 눈에 잘 읽히게 쿼리를 작성하는 것
    • "좋은" 질문
      • 나의 문제를 잘 정리해서 질문의 요점을 파악하고, 그 부분을 요약해 전달
      • 시도한 내용 구체적으로 제시
      • 발생한 문제의 원인이 무엇이라고 생각했는지 내용을 넣으면 좋음
      • 그 문제를 통해 스스로가 해결을 위해 얻은 결론은 무엇인지, 그 결론을 통해 해 본 시도는 무엇인지 파악하고 어떤 부분에서 어떻게 문제가 발생했고, 어떤 어려움을 겪고 있는지를 구체적으로 이야기
      • 현재 상태와 원했던 결과의 차이점을 파악하고 문제가 생겼을 것이라고 예상 가는 부분을 먼저 정리해 공유
  • 용어 정리: 생소하거나 중요한 용어 정의 확인
    • stackoverflow
      : 컴퓨터 프로그래밍의 다양한 주제에 대한 질문과 답변의 기능을 하는 웹사이트
    • MySQL 공식 문서: 공식 홈페이지에서 제공하는 설명서
    • Query: 데이터베이스나 데이터 리포지토리 시스템에서 데이터나 정보를 요청하는 것

실무 적용 사례

  • 아티클에서 다룬 분석 방법을 실제 업무에서 어떻게 적용할 수 있을까?
    (관련 사례를 찾아보거나, 가상의 시나리오 만들기)
    • 실습 중 궁금한 점 물어볼 떄 질문 템플릿에 맞춰 내용 공유하기
profile
2 B R 0 2 B

0개의 댓글