[DB]프로그래머스 SELECT 20문제 풀이 모음
프로그래머스 SELECT 20문제 풀이 모음
level 1
1. 인기있는 아이스크림
SELECT FLAVOR
FROM FIRST_HALF
ORDER BY TOTAL_ORDER DESC, SHIPMENT_ID
2. 강원도에 위치한 생산공장 목록 출력하기
SELECT FACTORY_ID, FACTORY_NAME, ADDRESS
FROM FOOD_FACTORY
WHERE ADDRESS LIKE '%강원도%'
ORDER BY FACTORY_ID
3. 평균 일일 대여 요금 구하기
SELECT ROUND(AVG(DAILY_FEE),0) AS AVERAGE_FEE
FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE = 'SUV'
배운점 : 반올림을 하려면 ROUND(값,반올림할 자릿수)을 사용하면 된다.
4. 12세 이하인 여자 환자 목록 출력하기
SELECT PT_NAME, PT_NO, GEND_CD, AGE, IFNULL(TLNO, 'NONE') AS TLNO
FROM PATIENT
WHERE (GEND_CD = 'W' AND AGE <= 12)
ORDER BY AGE DESC ,PT_NAME
배운점 : 전화번호가 없는 경우, ‘NONE’으로 출력은 IFNULL(TLNO, ‘NONE’)코드를 사용하면 된다.
만약 조건이 두개 이상이라면 CASE를 사용하면 된다.
5. 조건에 맞는 도서 리스트 출력하기
SELECT BOOK_ID, DATE_FORMAT(PUBLISHED_DATE, '%Y-%m-%d') as PUBLISHED_DATE
FROM BOOK
WHERE PUBLISHED_DATE BETWEEN '2021-01-01' AND '2021-12-31'
AND CATEGORY = '인문'
ORDER BY PUBLISHED_DATE ASC;
배운점 : 날짜 출력 형식을 수정하려면 DATE_FORMAT(값, ‘형식’)을 사용하면 된다. 이때 대문자 Y는 2021이 다 나오고 소문자 y는 21만 나온다.
6. 과일로 만든 아이스크림 고르기
SELECT FLAVOR
FROM FIRST_HALF F
WHERE TOTAL_ORDER > 3000
AND F.FLAVOR IN (
SELECT I.FLAVOR
FROM ICECREAM_INFO I
WHERE INGREDIENT_TYPE = 'fruit_based'
)
ORDER BY TOTAL_ORDER DESC
nested subquery를 사용해서 짜보았다.
그런데 inner join을 사용해도 될것 같아서 아래와 같이 다시 짜보았다.
SELECT F.FLAVOR
FROM FIRST_HALF F JOIN ICECREAM_INFO I
ON F.FLAVOR = I.FLAVOR
WHERE F.TOTAL_ORDER > 3000 AND I.INGREDIENT_TYPE = 'fruit_based'
ORDER BY F.TOTAL_ORDER DESC
배운점 :
subquery에는 종류가 scalar, inline view, nested(in, exists, any, all)이 있다.
join에는 종류가 inner, natural, full outer, left outer, right outer, cross join 이 있다.
나중에 정리해봐야겠다.
7. 흉부외과 또는 일반외과 의사 목록 출력하기
SELECT DR_NAME, DR_ID, MCDP_CD, DATE_FORMAT(HIRE_YMD,'%Y-%m-%d') AS HIRE_YMD
FROM DOCTOR
WHERE MCDP_CD = 'CS'
OR MCDP_CD = 'GS'
ORDER BY HIRE_YMD DESC, DR_NAME ASC;
8. 조건에 부합하는 중고거래 댓글 조회하기
SELECT B.TITLE,
B.BOARD_ID,
R.REPLY_ID,
R.WRITER_ID,
R.CONTENTS,
DATE_FORMAT(R.CREATED_DATE,'%Y-%m-%d') AS CREATED_DATE
FROM USED_GOODS_BOARD B
JOIN USED_GOODS_REPLY R
ON B.BOARD_ID = R.BOARD_ID
WHERE B.CREATED_DATE BETWEEN '2022-10-01' AND '2022-10-31'
ORDER BY R.CREATED_DATE ASC, B.TITLE ASC
9. 모든 레코드 조회하기
SELECT *
FROM ANIMAL_INS
ORDER BY ANIMAL_ID ASC
10. 역순 정렬하기
SELECT NAME, DATETIME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID DESC
11. 아픈 동물 찾기
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION = 'Sick'
ORDER BY ANIMAL_ID
12. 어린 동물 찾기
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION != 'Aged'
ORDER BY ANIMAL_ID
배운점 : ‘!=’ 연산자 대신 NOT IN을 사용해도 된다. 이때 NOT IN (‘Aged’, ‘Sick’, ‘Normal’)과 같이 여러개를 포함되지 않는 조건으로 사용 가능하다.
13. 동물의 아이디와 이름
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
14. 여러 기준으로 정렬하기
SELECT ANIMAL_ID, NAME, DATETIME
FROM ANIMAL_INS
ORDER BY NAME ASC, DATETIME DESC
15. 상위 n개 레코드
SELECT NAME
FROM ANIMAL_INS
WHERE DATETIME IN(
SELECT MIN(DATETIME)
FROM ANIMAL_INS
)
16. 조건에 맞는 회원수 구하기
SELECT COUNT(*)
FROM USER_INFO
WHERE (JOINED BETWEEN '2021-01-01' AND '2021-12-31')
AND AGE >= 20
AND AGE <= 29
배운점 : 데이터 개수를 구하려면 COUNT(속성)을 사용하면 된다.
level 2
17. 3월에 태어난 여성 회원 목록 출력하기
SELECT MEMBER_ID,
MEMBER_NAME,
GENDER,
DATE_FORMAT(DATE_OF_BIRTH, '%Y-%m-%d') AS DATE_OF_BIRTH
FROM MEMBER_PROFILE
WHERE MONTH(DATE_OF_BIRTH) = '03'
AND TLNO IS NOT NULL
AND GENDER = 'W'
ORDER BY MEMBER_ID ASC
배운점 : 날짜에서 ‘월’만 가져오고 싶다면 MONTH()을 사용하면 된다.
18. 재구매가 일어난 상품과 회원 리스트 구하기
SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(*) >1 -- 여기서 COUNT(속성명)이 아닌 COUNT(*)이유는 NULL 값을 포함한 개수까지 세기 때문이다.
ORDER BY USER_ID ASC, PRODUCT_ID DESC
배운점 : 중복 데이터를 가져오고 싶으면 GROUP BY, HAVING을 사용하면 되는데
이때 동일한 데이터 중에 동일한 다른 속성을 가진 데이터를 가져오고 싶으면 ‘GROUP BY 속성, 속성’ 을 하면 된다.
또한 COUNT(속성명)이 아닌 COUNT(*)이유는 NULL 값을 포함한 개수까지 세기 때문이다.
level 4
19.
20.
Leave a comment