코딩테스트/SQL
[코딩테스트] 프로그래머스 SQL SELECT 1 ~ 10
[dev] hiro
2024. 11. 4. 18:24
제가 공부한 내용을 정리하는 블로그입니다.
아직 많이 부족하고 배울게 너무나도 많습니다. 틀린내용이 있으면 언제나 가감없이 말씀해주시면 감사하겠습니다😁
Programmers SQL 고득점 Kit(SELECT)입니다.
평균 일일 대여 요금 구하기
SELECT ROUND(AVG(DAILY_FEE), 0) AS AVERAGE_FEE
FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE = 'SUV';
- DAILY_FEE의 평균을 계산한 후 소수점 첫째 자리에서 반올림하여 정수로 반환합니다.
(ROUND(AVG(DAILY_FEE), 0)) - CAR_TYPE이 'SUV'인 레코드만 필터링하여 평균을 계산합니다.
(WHERE CAR_TYPE = 'SUV)
과일로 만든 아이스크림 고르기
SELECT
A.FLAVOR
FROM FIRST_HALF A JOIN ICECREAM_INFO B ON A.FLAVOR = B.FLAVOR
WHERE
A.TOTAL_ORDER >= 3000 AND
B.INGREDIENT_TYPE = 'fruit_based'
ORDER BY
A.TOTAL_ORDER DESC
- FIRST_HALF 테이블과 ICECREAM_INFO 테이블을 FLAVOR를 기준으로 조인합니다.
(FROM FIRST_HALF A JOIN ICECREAM_INFO B ON A.FLAVOR = B.FLAVOR) - TOTAL_ORDER가 3000이 넘고 아이스크림의 주 성분이 과일인 맛을 조회합니다.
(WHERE A.TOTAL_ORDER >= 3000 AND B.INGREDIENT_TYPE = 'fruit_based') - 총 주문량이 큰 순서대로 정렬합니다.
(ORDER BY A.TOTAL_ORDER DESC)
3월에 태어난 여성 회원 목록 출력하기
SELECT
MEMBER_ID,
MEMBER_NAME,
GENDER,
TO_CHAR(DATE_OF_BIRTH, 'YYYY-MM-DD')
FROM MEMBER_PROFILE
WHERE TLNO IS NOT NULL AND TO_CHAR(DATE_OF_BIRTH, 'MM') = '03' AND GENDER = 'W'
ORDER BY MEMBER_ID;
- 타입을 맞춰주기 위해 TO_CHAR를 사용합니다.
(TO_CHAR(DATE_OF_BIRTH, 'YYYY-MM-DD')) - TLNO가 NULL이 아니며 생월이 3월이며 여성인 멤버를 조회합니다.
(WHERE TLNO IS NOT NULL AND TO_CHAR(DATE_OF_BIRTH, 'MM') = '03' AND GENDER = 'W') - 멤버 아이디를 기준으로 오름차순 정렬합니다.
(ORDER BY MEMBER_ID;)
서울에 위치한 식당 목록 출력하기
SELECT
I.REST_ID,
I.REST_NAME,
I.FOOD_TYPE,
I.FAVORITES,
I.ADDRESS,
R.SCORE
FROM REST_INFO I JOIN (
SELECT REST_ID, ROUND(AVG(REVIEW_SCORE), 2) AS SCORE
FROM REST_REVIEW
GROUP BY REST_ID
)R
ON I.REST_ID = R.REST_ID
WHERE I.ADDRESS LIKE '서울%'
ORDER BY score desc, I.FAVORITES DESC
- REST_REVIEW 테이블에서 REST_ID를 기준으로 GROUP BY를 하여 리뷰 평균점수를 구한 테이블을 R이라고합니다.
- REST_INFO 테이블과 위에서 구한 테이블 R과 REST_ID를 기준으로 조인합니다.
(REST_INFO I JOIN (...)R ON I.REST_ID = R.REST_ID) - 식당은 서울에 위치해야하므로 LIKE를 이용합니다.
(WHERE I.ADDRESS LIKE '서울%') - SCORE가 높은 순서대로, 즐겨찾기가 높은 순서대로 정렬해줍니다.
(ORDER BY score desc, I.FAVORITES DESC)
흉부외과 또는 일반외과 의사 목록 출력하기
SELECT
DR_NAME,
DR_ID,
MCDP_CD,
TO_CHAR(HIRE_YMD, 'YYYY-MM-DD') AS HIRE_YMD
FROM DOCTOR
WHERE MCDP_CD = 'CS' or MCDP_CD = 'GS'
ORDER BY HIRE_YMD DESC, DR_NAME ASC;
- 흉부외과(CS), 일반외과(GS)인 의사의 정보를 조회합니다.
(WHERE MCDP_CD = 'CS' or MCDP_CD = 'GS') - 고용일자를 내림차순, 의사의 이름을 기준으로 오름차순으로 정렬합니다.
(ORDER BY HIRE_YMD DESC, DR_NAME ASC;)
조건에 부합하는 중고거래 댓글 조회하기
SELECT
B.TITLE,
B.BOARD_ID,
R.REPLY_ID,
R.WRITER_ID,
R.CONTENTS,
TO_CHAR(R.CREATED_DATE, 'YYYY-MM-DD')
FROM USED_GOODS_BOARD B JOIN USED_GOODS_REPLY R
ON B.BOARD_ID = R.BOARD_ID
WHERE TO_CHAR(B.CREATED_DATE, 'YYYY-MM') = '2022-10'
ORDER BY R.CREATED_DATE ASC, B.TITLE ASC
- USED_GOODS_BOARD 테이블과 USED_GOODS_REPLY를 BOARD_ID를 통해 조인합니다
(USED_GOODS_BOARD B JOIN USED_GOODS_REPLY R ON B.BOARD_ID = R.BOARD_ID) - 그 중 2022년 10월에 작성된 게시물을 찾기 위해 TO_CHAR를 통해 조건을 걸어줍니다.
(WHERE TO_CHAR(B.CREATED_DATE, 'YYYY-MM') = '2022-10') - 댓글 작성일을 기준으로 오름차순, 게시물 제목을 기준으로 오름차순 정렬해줍니다.
(ORDER BY R.CREATED_DATE ASC, B.TITLE ASC)
인기있는 아이스크림
SELECT FLAVOR
FROM FIRST_HALF
ORDER BY TOTAL_ORDER DESC, SHIPMENT_ID ASC;
- 아이스크림의 맛을 총 주문량을 기준으로 내림차순 정렬하고 출하 번호를 기준으로 오름차순 정렬합니다.
(ORDER BY TOTAL_ORDER DESC, SHIPMENT_ID ASC;)
강원도에 위치한 생산공장 목록 출력하기
SELECT
FACTORY_ID,
FACTORY_NAME,
ADDRESS
FROM FOOD_FACTORY
WHERE ADDRESS Like '강원%'
ORDER BY FACTORY_ID ASC
- FOOD_FACTORY 테이블에서 주소가 강원도인 데이터를 LIKE를 통해 조회합니다.
(WHERE ADDRESS Like '강원%') - FACTORY_ID를 기준으로 오름차순 정렬합니다.
(ORDER BY FACTORY_ID ASC)
12세 이하인 여자 환자 목록 출력하기
SELECT
PT_NAME,
PT_NO,
GEND_CD,
AGE,
NVL(TLNO, 'NONE')
FROM PATIENT
WHERE GEND_CD = 'W' AND AGE <= 12
ORDER BY AGE DESC, PT_NAME ASC;
- PATIENT 테이블에서 12세 이하 여자 환자 데이터를 조회하기 위해 조건을 걸어줍니다.
(WHERE GEND_CD = 'W' AND AGE <= 12) - TLNO가 없을 때는 NONE으로 출력하기 위해 NVL을 사용합니다.
(NVL(TLNO, 'NONE')) - 나이가 많은 순, 이름을 기준으로 오름차순으로 정렬합니다.
(ORDER BY AGE DESC, PT_NAME ASC;)
조건에 맞는 도서 리스트 출력하기
SELECT
BOOK_ID,
TO_CHAR(PUBLISHED_DATE, 'YYYY-MM-DD')
FROM BOOK
WHERE CATEGORY = '인문' AND TO_CHAR(PUBLISHED_DATE, 'YYYY') = '2021'
ORDER BY PUBLISHED_DATE ASC
- BOOK 테이블에서 카테고리가 인문이고 2021년에 출판된 책의 데이터를 조회합니다.
(WHERE CATEGORY = '인문' AND TO_CHAR(PUBLISHED_DATE, 'YYYY') = '2021') - 출판일을 기준으로 오름차순 정렬해줍니다.
(ORDER BY PUBLISHED_DATE ASC)