SQL 고득점 Kit - 8.26

김동현·2024년 9월 2일

SQL 고득점 Kit

목록 보기
40/56

26일부터 29일까지 예비군 훈련으로 열심히 하지 않았다... (사실 핑계.. 할 수 있었는데 힘들어서 안 했음... 반성함)

String, Date - 조건에 부합하는 중고거래 상태 조회하기

문제

USED_GOODS_BOARD 테이블에서 2022년 10월 5일에 등록된 중고거래 게시물의 게시글 ID, 작성자 ID, 게시글 제목, 가격, 거래상태를 조회하는 SQL문을 작성해주세요. 거래상태가 SALE 이면 판매중, RESERVED이면 예약중, DONE이면 거래완료 분류하여 출력해주시고, 결과는 게시글 ID를 기준으로 내림차순 정렬해주세요.

https://school.programmers.co.kr/learn/courses/30/lessons/164672

풀이

-- 2022년 10월 5일에 등록된 중고거래 게시물의 게시글 ID, 작성자 ID, 게시글 제목, 가격, 거래상태를 조회
SELECT 
    BOARD_ID,
    WRITER_ID,
    TITLE,
    PRICE,
    CASE
        WHEN STATUS = 'SALE' THEN '판매중'
        WHEN STATUS = 'RESERVED' THEN '예약중'
        ELSE '거래완료'
    END 'STATUS'
FROM USED_GOODS_BOARD
WHERE CREATED_DATE = '2022-10-05'
ORDER BY BOARD_ID DESC

리뷰

  • CASE를 이용하여 상태를 변환해주고 날짜의 형태를 확인하여 조건을 생성 후 쿼리 작성

IS NULL - ROOT 아이템 구하기

문제

ROOT 아이템을 찾아 아이템 ID(ITEM_ID), 아이템 명(ITEM_NAME)을 출력하는 SQL문을 작성해 주세요. 이때, 결과는 아이템 ID를 기준으로 오름차순 정렬해 주세요.

https://school.programmers.co.kr/learn/courses/30/lessons/273710

풀이

## Root ITEM
WITH null_id as(
    SELECT ITEM_ID
    FROM ITEM_TREE 
    WHERE PARENT_ITEM_ID IS NULL -- Null 값 추출
)

SELECT ii.ITEM_ID, ii.ITEM_NAME
FROM ITEM_INFO ii
INNER JOIN null_id ni
ON ii.ITEM_ID = ni.ITEM_ID
ORDER BY ii.ITEM_ID

-- 해당 쿼리는 많은 데이터가 존재할 때 조인 이후 필터링이 되기 때문에 비효율적이라고 판단.
# SELECT ii.ITEM_ID, ii.ITEM_NAME
# FROM ITEM_INFO ii
# INNER JOIN ITEM_TREE it
# ON ii.ITEM_ID = it.ITEM_ID
# WHERE it.PARENT_ITEM_ID IS NULL
# ORDER BY ii.ITEM_ID

리뷰

  • ROOT 아이템은 부모아이템 아이디가 NULL이기 때문에 NULL 조건만 필터링을 먼저하여 조인 효율 극대화시킨다.
  • 그 후 조인을 통해 ROOT아이템의 아이디와 이름을 출력하는 쿼리 작성
  • 주석 쿼리는 조인하고 난 뒤에 필터링을 진행하는데 그렇게 진행한다면 비효율적인 동작을 할 것 같아서 수정을 진행했다. (이것도 정답이긴함.)

GitHub

조건에 부합하는 중고거래 상태 조회하기
https://github.com/lasentia/SQL_Study/tree/main/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4/2/164672.%E2%80%85%EC%A1%B0%EA%B1%B4%EC%97%90%E2%80%85%EB%B6%80%ED%95%A9%ED%95%98%EB%8A%94%E2%80%85%EC%A4%91%EA%B3%A0%EA%B1%B0%EB%9E%98%E2%80%85%EC%83%81%ED%83%9C%E2%80%85%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0

ROOT 아이템 구하기
https://github.com/lasentia/SQL_Study/tree/main/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4/2/273710.%E2%80%85ROOT%E2%80%85%EC%95%84%EC%9D%B4%ED%85%9C%E2%80%85%EA%B5%AC%ED%95%98%EA%B8%B0

profile
'The best way to get started is to quit talking and begin doing.'

0개의 댓글