image





코드스테이츠와 함께하는 ‘SQL Challenge’ 5일차

코드스테이츠에서 5~6월 연휴기간동안 방학을 줬다. 방학에는 방학숙제가 있다. 방학숙제는 프로그래머스 스쿨 “SQL 고득점 Kit” 하루에 3문제씩 풀기





Daily Reflection : 3L 회고

배운 것(Learned)

간략한 테이블 조회부터 시작해서, 조건을 하나씩 늘려가며 쿼리문을 작성하니 논리적으로 이해하기 쉽다.


아쉬웠던 점(Lacked)

조건을 추가하는 과정이 익숙해지면 더 빨라지겠지?


좋았던 점(Liked)

쿼리문작성하는데 자신감이 붙었다.





SELECT : 조건에 맞는 도서 리스트 출력하기

문제 설명과 문제📜

문제 설명

다음은 어느 한 서점에서 판매중인 도서들의 도서 정보(BOOK) 테이블입니다. BOOK 테이블은 각 도서의 정보를 담은 테이블로 아래와 같은 구조로 되어있습니다.

Column name Type Nullable Description
BOOK_ID INTEGER FALSE 도서 ID
CATEGORY VARCHAR(N) FALSE 카테고리 (경제, 인문, 소설, 생활, 기술)
AUTHOR_ID INTEGER FALSE 저자 ID
PRICE INTEGER FALSE 판매가 (원)
PUBLISHED_DATE DATE FALSE 출판일


문제

BOOK 테이블에서 2021년에 출판'인문' 카테고리에 속하는 도서 리스트를 찾아서 도서 ID(BOOK_ID), 출판일 (PUBLISHED_DATE)을 출력하는 SQL문을 작성해주세요. 결과는 출판일을 기준으로 오름차순 정렬해주세요.



풀이🔎

BOOK 테이블 살펴보기

SELECT      *
FROM        BOOK
;
  • 책이 7권 밖에 없다


2021년에 출판 조회하기

SELECT      *
FROM        BOOK
WHERE       YEAR(PUBLISHED_DATE) = 2021
;


'인문' 카테고리 조회하기

SELECT      *
FROM        BOOK
WHERE       YEAR(PUBLISHED_DATE) = 2021
      AND   CATEGORY = '인문'
;


도서 ID(BOOK_ID), 출판일 (PUBLISHED_DATE) 출력하기

SELECT      BOOK_ID, DATE_FORMAT(PUBLISHED_DATE, '%Y-%m-%d')
FROM        BOOK
WHERE       YEAR(PUBLISHED_DATE) = 2021
      AND   CATEGORY = '인문'
;


출판일을 기준으로 오름차순 정렬하기

SELECT      BOOK_ID, DATE_FORMAT(PUBLISHED_DATE, '%Y-%m-%d')
FROM        BOOK
WHERE       YEAR(PUBLISHED_DATE) = 2021
      AND   CATEGORY = '인문'
ORDER BY    PUBLISHED_DATE ASC
;
  • 주의사항
    • PUBLISHED_DATE의 데이트 포맷이 예시와 동일해야 정답처리
  • 통과🎉





GROUP BY : 조건에 맞는 사용자와 총 거래금액 조회하기

문제 설명과 문제📜

문제 설명

다음은 중고 거래 게시판 정보를 담은 USED_GOODS_BOARD 테이블과 중고 거래 게시판 첨부파일 정보를 담은 USED_GOODS_FILE 테이블입니다. USED_GOODS_BOARD 테이블은 다음과 같으며 BOARD_ID, WRITER_ID, TITLE, CONTENTS, PRICE, CREATED_DATE, STATUS, VIEWS는 게시글 ID, 작성자 ID, 게시글 제목, 게시글 내용, 가격, 작성일, 거래상태, 조회수를 의미합니다.

Column name Type Nullable
BOARD_ID VARCHAR(5) FALSE
WRITER_ID VARCHAR(50) FALSE
TITLE VARCHAR(100) FALSE
CONTENTS VARCHAR(1000) FALSE
PRICE NUMBER FALSE
CREATED_DATE DATE FALSE
STATUS VARCHAR(10) FALSE
VIEWS NUMBER FALSE

USED_GOODS_USER 테이블은 다음과 같으며 USER_ID, NICKNAME, CITY, STREET_ADDRESS1, STREET_ADDRESS2, TLNO는 각각 회원 ID, 닉네임, 시, 도로명 주소, 상세 주소, 전화번호를 를 의미합니다.

Column name Type Nullable
USER_ID VARCHAR(50) FALSE
NICKANME VARCHAR(100) FALSE
CITY VARCHAR(100) FALSE
STREET_ADDRESS1 VARCHAR(100) FALSE
STREET_ADDRESS2 VARCHAR(100) TRUE
TLNO VARCHAR(20) FALSE


문제

USED_GOODS_BOARDUSED_GOODS_USER 테이블에서 완료된 중고 거래총금액이 70만 원 이상인 사람의 회원 ID, 닉네임, 총거래금액을 조회하는 SQL문을 작성해주세요. 결과는 총거래금액을 기준으로 오름차순 정렬해주세요.



풀이🔎

USED_GOODS_BOARD 테이블 살펴보기

SELECT      *
FROM        USED_GOODS_BOARD
;
  • 반려견 배변패드 같은 것을 파는구나
  • 거래완료는 STATUS 칼럼이 DONE 이라고 되어있음
  • 등록날짜(CREATED_DATE)는 DATE 타입이기 때문에 포멧지정 필요할 것 같음
    • 정답과는 상관 없음


USED_GOODS_USER 테이블 살펴보기

SELECT      *
FROM        USED_GOODS_USER
;
  • 주소가 모두 성남
  • 전화번호가 진짜일까?
  • WRITER_IDUSER_IDJOIN하면 좋을 것 같음


테이블 합치기

SELECT      *
FROM        USED_GOODS_BOARD B
JOIN        USED_GOODS_USER U
      ON    B.WRITER_ID = U.USER_ID
;


완료된 중고 거래 조회하기

SELECT      *
FROM        USED_GOODS_BOARD B
JOIN        USED_GOODS_USER U
      ON    B.WRITER_ID = U.USER_ID
WHERE       STATUS = 'DONE'
;


작성자ID 별 총금액 조회하기

SELECT      *, SUM(PRICE) AS TOTAL_SALES
FROM        USED_GOODS_BOARD B
JOIN        USED_GOODS_USER U
      ON    B.WRITER_ID = U.USER_ID
WHERE       STATUS = 'DONE'
GROUP BY    WRITER_ID
;


총금액이 70만원 이상인 사람 조회하기

SELECT      *, SUM(PRICE) AS TOTAL_SALES
FROM        USED_GOODS_BOARD B
JOIN        USED_GOODS_USER U
      ON    B.WRITER_ID = U.USER_ID
WHERE       STATUS = 'DONE'
GROUP BY    WRITER_ID
HAVING      TOTAL_SALES >= 700000
;


회원 ID, 닉네임, 총거래금액을 총거래금액 기준으로 오름차순 정렬하기

SELECT      USER_ID, NICKNAME, SUM(PRICE) AS TOTAL_SALES
FROM        USED_GOODS_BOARD B
JOIN        USED_GOODS_USER U
      ON    B.WRITER_ID = U.USER_ID
WHERE       STATUS = 'DONE'
GROUP BY    WRITER_ID
HAVING      TOTAL_SALES >= 700000
ORDER BY    TOTAL_SALES ASC
;
  • 통과🎉





JOIN : 있었는데요 없었습니다

문제 설명과 문제📜

문제 설명

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

NAME TYPE NULLABLE
ANIMAL_ID VARCHAR(N) FALSE
ANIMAL_TYPE VARCHAR(N) FALSE
DATETIME DATETIME FALSE
INTAKE_CONDITION VARCHAR(N) FALSE
NAME VARCHAR(N) TRUE
SEX_UPON_INTAKE VARCHAR(N) FALSE

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다. ANIMAL_OUTS 테이블의 ANIMAL_IDANIMAL_INSANIMAL_ID의 외래 키입니다.

NAME TYPE NULLABLE
ANIMAL_ID VARCHAR(N) FALSE
ANIMAL_TYPE VARCHAR(N) FALSE
DATETIME DATETIME FALSE
NAME VARCHAR(N) TRUE
SEX_UPON_OUTCOME VARCHAR(N) FALSE


문제

관리자의 실수로 일부 동물의 입양일이 잘못 입력되었습니다. 보호 시작일보다 입양일이 더 빠른 동물아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일이 빠른 순으로 조회해야합니다.



풀이🔎

ANIMAL_INS 테이블 살펴보기

SELECT      *
FROM        ANIMAL_INS
;


ANIMAL_OUTS 테이블 살펴보기

SELECT      *
FROM        ANIMAL_OUTS
;


테이블 합치기

SELECT      OUTS.ANIMAL_ID, OUTS.NAME
FROM        ANIMAL_OUTS OUTS
JOIN        ANIMAL_INS INS
      ON    OUTS.ANIMAL_ID = INS.ANIMAL_ID
;


보호 시작일보다 입양일이 더 빠른 동물 조회하기

SELECT      OUTS.ANIMAL_ID, OUTS.NAME
FROM        ANIMAL_OUTS OUTS
JOIN        ANIMAL_INS INS
      ON    OUTS.ANIMAL_ID = INS.ANIMAL_ID
WHERE       OUTS.DATETIME < INS.DATETIME
;


보호 시작일이 빠른 순으로 조회하기

SELECT      OUTS.ANIMAL_ID, OUTS.NAME
FROM        ANIMAL_OUTS OUTS
JOIN        ANIMAL_INS INS
      ON    OUTS.ANIMAL_ID = INS.ANIMAL_ID
WHERE       OUTS.DATETIME < INS.DATETIME
ORDER BY    INS.DATETIME ASC
;
  • 통과🎉





끝까지 읽어주셔서 감사합니다😉





댓글남기기