🐬 SQL/🏆 MySQL 문제풀이

🔓 04. 프로그래머스 LEVEL2 문제풀이

nyamin9 2023. 10. 25. 11:51

모바일은 화면을 돌려 가로화면으로 보시는 게 읽으시기 편할 수 있습니다. 돌려서 보시는 걸 추천드릴게요!!

 

 

원래 문항은 구문에 따라 구분되어 있지만, 알고 푸는 것보다 모르고 푸는 게 재밌을 것 같아 난이도별로 공부하고 있습니다 :)

 


🔑 Q1. 조건에 부합하는 중고거래 상태 조회하기

 

☑️ 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

☑️ 풀이

- CASE 문을 사용한 COLUMN 분류, WHERE 절을 사용한 조건 사용

SELECT BOARD_ID, WRITER_ID, TITLE, PRICE, 
CASE 
WHEN STATUS = 'SALE' THEN '판매중'
WHEN STATUS = 'RESERVED' THEN '예약중'
ELSE '거래완료' END AS STATUS
FROM USED_GOODS_BOARD
WHERE CREATED_DATE LIKE '2022-10-05%'
ORDER BY 1 DESC;

 


🔑 Q2. 자동차 평균 대여 기간 구하기

 

☑️ 문제

 
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

☑️ 풀이

- DATEDIFF 함수를 사용한 기간 연산, GROUP BY - HAVING 구문 이해

- DATEDIFF(END_DATE, START_DATE) : 변수 1로 더 나중 날짜가 들어가야 함

- 대여 기간 등을 구할 때는, DATEDIFF 함수 사용 후에 +1을 해줘야 함

- AS 문을 사용해 열의 이름을 다시 지정해 가져올 때, WHERE절에서는 그 이름을 못 쓰지만 HAVING 절은 가능함 

- HAVING 구문에서는 GROUP BY로 산출한 결과값이 들어갈 수 있음

SELECT CAR_ID, ROUND(AVG(DATEDIFF(END_DATE, START_DATE) + 1), 1) AS AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY 1
HAVING AVERAGE_DURATION >= 7
ORDER BY 2 DESC, 1 DESC;

 


🔑 Q3. 자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기

 

☑️ 문제

 
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

☑️ 풀이

- REGEXP 함수를 사용한 정규표현식

SELECT CAR_TYPE, COUNT(DISTINCT(CAR_ID)) AS CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS REGEXP '통풍시트|열선시트|가죽시트'
GROUP BY CAR_TYPE
ORDER BY 1;

 


🔑 Q4. 조건에 맞는 도서와 저자 리스트 출력하기

 

☑️ 문제

☑️ 풀이

- INNER JOIN 구문 사용

SELECT BOOK_ID, AUTHOR_NAME, DATE_FORMAT(PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE
FROM BOOK AS B
INNER JOIN AUTHOR AS A
ON B.AUTHOR_ID = A.AUTHOR_ID AND B.CATEGORY = '경제'
ORDER BY 3;

 


🔑 Q5. 성분으로 구분한 아이스크림 총 주문량

 

☑️ 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

☑️ 풀이

- INNER JOIN 구문 사용

SELECT INGREDIENT_TYPE, SUM(TOTAL_ORDER) AS TOTAL_ORDER
FROM FIRST_HALF AS F
INNER JOIN ICECREAM_INFO AS I
ON F.FLAVOR = I.FLAVOR
GROUP BY 1
ORDER BY 2;

 


🔑 Q6. 진료과별 총 예약 횟수 출력하기

 

☑️ 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

☑️ 풀이

- LIKE 구문 사용

SELECT MCDP_CD AS '진료과 코드', COUNT(DISTINCT(PT_NO)) AS '5월예약건수'
FROM APPOINTMENT
WHERE APNT_YMD LIKE '2022-05-%'
GROUP BY 1
ORDER BY 2, 1;

 


🔑 Q7. 재구매가 일어난 상품과 회원 리스트 구하기

 

☑️ 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

☑️ 풀이

- LIKE 구문 사용

SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE
GROUP BY 1, 2
HAVING COUNT(PRODUCT_ID) >= 2
ORDER BY 1, 2 DESC;

 

- 추가 : 중복 데이터 COUNT 쿼리

SELECT COLUMN1, COUNT(COLUMN2)
FROM TABLE
GROUP BY COLUMN1
HAVING COUNT(COLUMN2) >= 2;

 


🔑 Q8. 상품 별 오프라인 매출 구하기

 

☑️ 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

☑️ 풀이

- INNER JOIN, GROUP BY 구문 사용

SELECT PRODUCT_CODE, SUM(PRICE * SALES_AMOUNT) AS SALES
FROM PRODUCT AS P
INNER JOIN OFFLINE_SALE AS O
ON P.PRODUCT_ID = O.PRODUCT_ID
GROUP BY 1
ORDER BY 2 DESC, 1;

 


🔑 Q9. 가격대 별 상품 개수 구하기

 

☑️ 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

☑️ 풀이

- GROUP BY 구문 사용

- 집계 함수를 사용하는 경우, 집계의 기준을 정해줘야 하기 때문에 GROUP BY 구문이 반드시 필요함

SELECT FLOOR(PRICE / 10000) * 10000 AS PRICE_GROUP, COUNT(DISTINCT(PRODUCT_ID)) AS PRODUCTS
FROM PRODUCT 
GROUP BY 1
ORDER BY 1;

 


🔑 Q10. 카테고리 별 상품 개수 구하기

 

☑️ 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

☑️ 풀이

- LEFT(COLUMN, n) : 좌측에서 n개의 글자만 추출

- GROUP BY 구문 사용

SELECT LEFT(PRODUCT_CODE, 2) AS CATEGORY, COUNT(PRODUCT_ID) AS PRODUCTS
FROM PRODUCT
GROUP BY 1
ORDER BY 1;

 


🔑 Q11. 3월에 태어난 여성 회원 목록 출력하기

 

☑️ 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

☑️ 풀이

- DATE_FORMAT(COLUMN, '%Y-%m-%d') : 년-월-일 형태로 날짜 출력

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) = '3' 
AND GENDER = 'W' 
AND TLNO IS NOT NULL
ORDER BY 1;

 


🔑 Q12. 가격이 제일 비싼 상품의 정보 출력하기

 

☑️ 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

☑️ 풀이

- 서브쿼리 및 WHERE 조건문 사용

SELECT *
FROM FOOD_PRODUCT
WHERE PRICE = (SELECT MAX(PRICE) FROM FOOD_PRODUCT);

 


🔑 Q13. DATETIME에서 DATE로 형 변환

 

☑️ 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

☑️ 풀이

- DATE_FORMAT(COLUMN, '%Y-%m-%d') : 년-월-일 형태로 날짜 출력

SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME, '%Y-%m-%d') AS 날짜
FROM ANIMAL_INS
ORDER BY 1;

 


🔑 Q14. 입양 시각 구하기 (1)

 

☑️ 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

☑️ 풀이

- HOUR(DATETIME) : 시간만 추출

SELECT HOUR(DATETIME) AS HOUR, COUNT(ANIMAL_ID) AS COUNT
FROM ANIMAL_OUTS
GROUP BY 1
HAVING HOUR BETWEEN 9 AND 19
ORDER BY 1;

 


🔑 Q15. NULL 처리하기 

 

☑️ 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

☑️ 풀이

IS NULL : NULL 여부 확인 구문

SELECT ANIMAL_TYPE, 
CASE
WHEN NAME IS NOT NULL THEN NAME
WHEN NAME IS NULL THEN 'No name' END AS NAME, 
SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;

 


🔑 Q16. NULL 처리하기 

 

☑️ 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

☑️ 풀이

IS NULL : NULL 여부 확인 구문

SELECT ANIMAL_TYPE, 
CASE
WHEN NAME IS NOT NULL THEN NAME
WHEN NAME IS NULL THEN 'No name' END AS NAME, 
SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;

 


🔑 Q17. 중성화 여부 파악하기 

 

☑️ 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

☑️ 풀이

- REGEXP : 정규표현식

SELECT ANIMAL_ID, NAME, 
CASE
WHEN SEX_UPON_INTAKE REGEXP 'Neutered|Spayed' THEN 'O'
ELSE 'X' END AS 중성화
FROM ANIMAL_INS
ORDER BY 1;

 


🔑 Q18. 중복 제거하기 

 

☑️ 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

☑️ 풀이

- DISTINCT( ) : 고유값만 찾는 함수

SELECT COUNT(DISTINCT(NAME)) AS COUNT
FROM ANIMAL_INS;

 


🔑 Q19. 이름에 el이 들어가는 동물 찾기

 

☑️ 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

☑️ 풀이

- REGEXP : 정규표현식

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE ANIMAL_TYPE = 'DOG'
AND NAME REGEXP 'EL'
ORDER BY 2;

 


⛔ Q20. 루시와 엘라 찾기 

 

☑️ 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

☑️ 풀이

- REGEXP : 정규표현식

- ^( )$ : ^는 문자열의 첫 글자를, $는 마지막 글자를 의미함. 따라서 원하는 글자만을 찾는 경우, 시작과 끝을 정의해야 함.

 - 혹은, IN 을 사용해서 OR 느낌으로 사용해도 깔끔함.

-- 오답

SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME REGEXP 'Lucy|Ella|Pickle|Rogan|Sabrina|Mitty'
ORDER BY 1;


-- 정답 1 : REGEXP 사용
SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME REGEXP '^(Lucy|Ella|Pickle|Rogan|Sabrina|Mitty)$'
ORDER BY 1;


-- 정답 2 : IN 사용
SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME IN ('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty')
ORDER BY 1;

 


🔑 Q21. 동명 동물 수 찾기 

 

☑️ 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

☑️ 풀이

- SELECT - FROM - WHERE - GROUP BY - HAVING - ORDER BY

SELECT DISTINCT(NAME), COUNT(ANIMAL_ID) AS COUNT
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
GROUP BY 1
HAVING COUNT >= 2
ORDER BY 1;

 


🔑 Q22. 고양이와 개는 몇 마리 있을까  

 

☑️ 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

☑️ 풀이

SELECT ANIMAL_TYPE, COUNT(ANIMAL_ID) AS COUNT
FROM ANIMAL_INS
WHERE ANIMAL_TYPE REGEXP 'DOG|CAT'
GROUP BY 1
ORDER BY 1;