본문 바로가기
데이터분석/SQL

[프로그래머스] MySQL 코딩테스트(7) - SELECT편

by 클로버심 2025. 12. 15.

1. 코딩테스트 연습 > SELECT > 평균 일일 대여 요금 구하기

문제 설명
다음은 어느 자동차 대여 회사에서 대여중인 자동차들의 정보를 담은 CAR_RENTAL_COMPANY_CAR 테이블입니다. CAR_RENTAL_COMPANY_CAR 테이블은 아래와 같은 구조로 되어있으며, CAR_ID, CAR_TYPE, DAILY_FEE, OPTIONS 는 각각 자동차 ID, 자동차 종류, 일일 대여 요금(원), 자동차 옵션 리스트를 나타냅니다.

자동차 종류는 '세단', 'SUV', '승합차', '트럭', '리무진' 이 있습니다. 자동차 옵션 리스트는 콤마(',')로 구분된 키워드 리스트(예: '열선시트', '스마트키', '주차감지센서')로 되어있으며, 키워드 종류는 '주차감지센서', '스마트키', '네비게이션', '통풍시트', '열선시트', '후방카메라', '가죽시트' 가 있습니다.

 

문제
CAR_RENTAL_COMPANY_CAR 테이블에서 자동차 종류가 'SUV'인 자동차들의 평균 일일 대여 요금을 출력하는 SQL문을 작성해주세요. 이때 평균 일일 대여 요금은 소수 첫 번째 자리에서 반올림하고, 컬럼명은 AVERAGE_FEE 로 지정해주세요.

 

예시
예를 들어 CAR_RENTAL_COMPANY_CAR 테이블이 다음과 같다면

'SUV' 에 해당하는 자동차들의 평균 일일 대여 요금은 18,000 원 이므로, 다음과 같은 결과가 나와야 합니다.

 

내가 쓴 답

SELECT ROUND(AVG(DAILY_FEE),0) AS AVERAGE_FEE
FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE = 'SUV';

 

2. 코딩테스트 연습 > SELECT > 조건에 부합하는 중고거래 댓글 조회하기

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

USED_GOODS_REPLY 테이블은 다음과 같으며 REPLY_ID, BOARD_ID, WRITER_ID, CONTENTS, CREATED_DATE는 각각 댓글 ID, 게시글 ID, 작성자 ID, 댓글 내용, 작성일을 의미합니다.

 

문제
USED_GOODS_BOARD와 USED_GOODS_REPLY 테이블에서 2022년 10월에 작성된 게시글 제목, 게시글 ID, 댓글 ID, 댓글 작성자 ID, 댓글 내용, 댓글 작성일을 조회하는 SQL문을 작성해주세요. 결과는 댓글 작성일을 기준으로 오름차순 정렬해주시고, 댓글 작성일이 같다면 게시글 제목을 기준으로 오름차순 정렬해주세요.

 

예시
USED_GOODS_BOARD 테이블이 다음과 같고

USED_GOODS_REPLY 테이블이 다음과 같을 때

SQL을 실행하면 다음과 같이 출력되어야 합니다.

 

주의사항
CREATED_DATE의 포맷이 예시의 포맷과 일치해야 정답처리 됩니다.

 

처음 내가 쓴 답

SELECT UGD.TITLE, UGD.BOARD_ID, UGR.REPLY_ID, UGR.WRITER_ID, 
       UGR.CONTENTS, LEFT(UGR.CREATED_DATE, 10) AS CREATED_DATE
FROM USED_GOODS_BOARD AS UGD
LEFT JOIN USED_GOODS_REPLY AS UGR
ON UGD.BOARD_ID = UGR.BOARD_ID
WHERE UGR.CREATED_DATE BETWEEN '2022-10-01' AND '2022-10-31'
ORDER BY CREATED_DATE ASC, TITLE ASC;

오류 원인 : 댓글 ID, 댓글 작성자 ID, 댓글 내용, 댓글 작성일을 조회해야하므로 LEFT JOIN이 아닌 INNER JOIN을 써야함

 

두번째 내가 쓴 답

SELECT UGD.TITLE, UGD.BOARD_ID, UGR.REPLY_ID, UGR.WRITER_ID, 
       UGR.CONTENTS, DATE_FORMAT(UGR.CREATED_DATE, '%Y-%m-%d') AS CREATED_DATE
FROM USED_GOODS_BOARD AS UGD
INNER JOIN USED_GOODS_REPLY AS UGR
ON UGD.BOARD_ID = UGR.BOARD_ID
WHERE UGR.CREATED_DATE BETWEEN '2022-10-01' AND '2022-10-31'
ORDER BY CREATED_DATE ASC, TITLE ASC;

오류 원인 : "2022년 10월에 작성된" 이므로 USED_GOODS_REPLY 기준이 아닌 USED_GOODS_BOARD의 게시 날짜 기준으로 날짜 조건을 설정해야 함

 

최종 내가 쓴 답

SELECT UGD.TITLE, UGD.BOARD_ID, UGR.REPLY_ID, UGR.WRITER_ID, 
       UGR.CONTENTS, DATE_FORMAT(UGR.CREATED_DATE, '%Y-%m-%d') AS CREATED_DATE
FROM USED_GOODS_BOARD AS UGD
INNER JOIN USED_GOODS_REPLY AS UGR
ON UGD.BOARD_ID = UGR.BOARD_ID
WHERE UGD.CREATED_DATE BETWEEN '2022-10-01' AND '2022-10-31'
ORDER BY CREATED_DATE ASC, TITLE ASC;

 

3. 코딩테스트 연습 > SELECT > 12세 이하인 여자 환자 목록 출력하기

문제 설명
다음은 종합병원에 등록된 환자정보를 담은 PATIENT 테이블입니다. PATIENT 테이블은 다음과 같으며 PT_NO, PT_NAME, GEND_CD, AGE, TLNO는 각각 환자번호, 환자이름, 성별코드, 나이, 전화번호를 의미합니다.

 

문제
PATIENT 테이블에서 12세 이하인 여자환자의 환자이름, 환자번호, 성별코드, 나이, 전화번호를 조회하는 SQL문을 작성해주세요. 이때 전화번호가 없는 경우, 'NONE'으로 출력시켜 주시고 결과는 나이를 기준으로 내림차순 정렬하고, 나이 같다면 환자이름을 기준으로 오름차순 정렬해주세요.

 

예시
PATIENT 테이블이 다음과 같을 때

SQL을 실행하면 다음과 같이 출력되어야 합니다.

 

처음 내가 쓴 답 / 두번째 내가 쓴 답 (컬럼명만 지정)

SELECT PT_NAME, PT_NO, GEND_CD, AGE, IFNULL(TLNO, "NONE")
FROM PATIENT
WHERE AGE <= 12
ORDER BY AGE DESC, PT_NAME ASC;

오류 원인 : 여자환자 조건 누락, TLNO 컬럼명 미지정

 

최종 내가 쓴 답

SELECT PT_NAME, PT_NO, GEND_CD, AGE, IFNULL(TLNO, "NONE") AS TLNO
FROM PATIENT
WHERE AGE <= 12 AND GEND_CD = 'W'
ORDER BY AGE DESC, PT_NAME ASC;