SQL 고득점 Kit - 8.23

김동현·2024년 8월 23일

SQL 고득점 Kit

목록 보기
37/56

String, Date - 오랜 기간 보호한 동물(2)

문제

입양을 간 동물 중, 보호 기간이 가장 길었던 동물 두 마리의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 기간이 긴 순으로 조회해야 합니다.

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

풀이

SELECT 
    outs.ANIMAL_ID, outs.NAME
FROM 
    ANIMAL_INS ins
INNER JOIN 
    ANIMAL_OUTS outs
ON 
    ins.ANIMAL_ID = outs.ANIMAL_ID
ORDER BY 
    DATEDIFF(outs.DATETIME, ins.DATETIME) DESC -- 날짜의 뺄셈 연산
LIMIT 2

리뷰

  • 날짜를 연산하는 함수를 아직 잘 모르는 것 같다.
  • 문제를 읽고 어떻게 풀 수 있을지 흐름은 떠올라서 함수만 찾으면 충분히 바로 풀 수 있다.

String, Date - 대여 기록이 존재하는 자동차 리스트 구하기

문제

CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 자동차 종류가 '세단'인 자동차들 중 10월에 대여를 시작한 기록이 있는 자동차 ID 리스트를 출력하는 SQL문을 작성해주세요. 자동차 ID 리스트는 중복이 없어야 하며, 자동차 ID를 기준으로 내림차순 정렬해주세요.

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

풀이

SELECT 
    DISTINCT his.CAR_ID -- 중복 제외
FROM 
    CAR_RENTAL_COMPANY_CAR car
INNER JOIN 
    CAR_RENTAL_COMPANY_RENTAL_HISTORY his
ON 
    car.CAR_ID = his.CAR_ID
WHERE 
    MONTH(his.START_DATE) LIKE '%10%' -- 10월 대여 기록
AND 
    car.CAR_TYPE = '세단' -- 세단 종류
ORDER BY 
    his.CAR_ID DESC

리뷰

  • DISTINCT를 이용하여 중복을 제외한 값만 출력하는 것이 키워드.
  • 10월에 대여한 기록을 필터링하기 위해서 MONTH를 이용하여 월로만 조건을 검색할 수 있었다.

String, Date - 조건에 맞는 사용자 정보 조회하기

문제

USED_GOODS_BOARD와 USED_GOODS_USER 테이블에서 중고 거래 게시물을 3건 이상 등록한 사용자의 사용자 ID, 닉네임, 전체주소, 전화번호를 조회하는 SQL문을 작성해주세요. 이때, 전체 주소는 시, 도로명 주소, 상세 주소가 함께 출력되도록 해주시고, 전화번호의 경우 xxx-xxxx-xxxx 같은 형태로 하이픈 문자열(-)을 삽입하여 출력해주세요. 결과는 회원 ID를 기준으로 내림차순 정렬해주세요.

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

풀이

# board에서 3건 이상 등록한 사용자만 추출 후 유저 테이블 결합
WITH user3 AS (
    SELECT WRITER_ID, COUNT(WRITER_ID)
    FROM USED_GOODS_BOARD 
    GROUP BY WRITER_ID
    HAVING COUNT(WRITER_ID) >= 3 -- 3건 이상
)

-- 출력할 때 전화번호 형식 맞추기
SELECT u.USER_ID, u.NICKNAME, 
    CONCAT(u.CITY,' ',u.STREET_ADDRESS1,' ', u.STREET_ADDRESS2) '전체주소',
    CONCAT(SUBSTR(u.TLNO, 1, 3),'-',SUBSTR(u.TLNO, 4, 4),'-',SUBSTR(u.TLNO, 8, 4)) '전화번호'
FROM USED_GOODS_USER u
RIGHT JOIN user3 u3
ON u.USER_ID = u3.WRITER_ID
ORDER BY u.USER_ID DESC

리뷰

  • 전화번호의 형식을 맞추는 것에서 어려움을 느껴 검색을 했다. 검색한 결과 SUBSTR을 이용하여 문자열의 원하는 구간까지 출력할 수 있었는데 -을 삽입하는 방법은 알지 못했다.
  • 혹시나 하는 마음으로 CONCAT을 사용하니 적용되어 풀 수 있었다.
  • 처음엔 회원 가입한 테이블에 있는 ID만 조인하면 된다고 생각해서 LEFT 조인을 했다. 그렇지만 3건 이상의 ID에서 출력을 원하는 것이라 RIGHT 조인으로 수정하니 맞췄다. (INNER JOIN을 쓰면 그런 생각 없이 편했을텐데 ㅎㅎㅎ....)

GitHub

오랜 기간 보호한 동물(2)
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/3/59411.%E2%80%85%EC%98%A4%EB%9E%9C%E2%80%85%EA%B8%B0%EA%B0%84%E2%80%85%EB%B3%B4%ED%98%B8%ED%95%9C%E2%80%85%EB%8F%99%EB%AC%BC%EF%BC%882%EF%BC%89

대여 기록이 존재하는 자동차 리스트 구하기
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/3/157341.%E2%80%85%EB%8C%80%EC%97%AC%E2%80%85%EA%B8%B0%EB%A1%9D%EC%9D%B4%E2%80%85%EC%A1%B4%EC%9E%AC%ED%95%98%EB%8A%94%E2%80%85%EC%9E%90%EB%8F%99%EC%B0%A8%E2%80%85%EB%A6%AC%EC%8A%A4%ED%8A%B8%E2%80%85%EA%B5%AC%ED%95%98%EA%B8%B0

조건에 맞는 사용자 정보 조회하기
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/3/164670.%E2%80%85%EC%A1%B0%EA%B1%B4%EC%97%90%E2%80%85%EB%A7%9E%EB%8A%94%E2%80%85%EC%82%AC%EC%9A%A9%EC%9E%90%E2%80%85%EC%A0%95%EB%B3%B4%E2%80%85%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0

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

0개의 댓글