MySQL

MySQL 프로그래머스 문제 정리

lyndaa 2023. 3. 19. 17:05
  • 가장 먼저 들어온 동물의 이름 출력
SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME
LIMIT 1;
  • 2021년에 가입한 회원 중 나이가 20세 이상 29세 이하인 회원의 수 출력
SELECT COUNT (*) AS USERS
FROM USER_INFO
WHERE AGE BETWEEN 20 AND 29 AND YEAR(JOINED)=2021;
  • 가격이 가장 비싼 음식 출력 

       👇🏻 LIMIT (LIMIT 시작점, 갯수 or LIMIT 갯수)

SELECT PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD, CATEGORY, PRICE
FROM FOOD_PRODUCT
ORDER BY PRICE DESC
LIMIT 1;

       👇🏻 WHERE 조건문

SELECT PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD, CATEGORY, PRICE
FROM FOOD_PRODUCT
WHERE PRICE = (SELECT MAX(PRICE) FROM FOOD_PRODUCT);
  • 이름이 NULL이 아니고 중복되지 않는 동물의 수
SELECT COUNT(DISTINCT NAME)
FROM ANIMAL_INS
WHERE NAME IS NOT NULL;
  • 음식종류별로 즐겨찾기가 가장 많은 식당의 정보를 음식 종류 기준 내림차순 정렬
SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO
WHERE (FOOD_TYPE, FAVORITES) IN (
    SELECT FOOD_TYPE, MAX(FAVORITES)
    FROM REST_INFO
    GROUP BY FOOD_TYPE
)
ORDER BY 1 DESC;

 

  • 두번 이상 쓰인 이름과 그 횟수를 출력
SELECT NAME, COUNT(name) COUNT
FROM ANIMAL_INS
GROUP BY NAME
HAVING COUNT(name)>1
ORDER BY NAME;
  • 두개의 테이블에서 년, 월, 성별 별로 상품을 구매한 회원수 출력 / 결과는 년, 월, 성별 기준 오름차순 정렬이며 성별 정보가 없는 경우 결과에서 제외
SELECT YEAR(O.SALES_DATE), MONTH(O.SALES_DATE), U.GENDER, COUNT(DISTINCT U.USER_ID)
FROM ONLINE_SALE O
JOIN USER_INFO U ON O.USER_ID = U.USER_ID
GROUP BY YEAR(SALES_DATE), MONTH(SALES_DATE), GENDER
HAVING GENDER IS NOT NULL
ORDER BY YEAR(SALES_DATE), MONTH(SALES_DATE), GENDER;
  • 성분으로 구분한 아이스크림 총 주문량 출력
SELECT INGREDIENT_TYPE, SUM(TOTAL_ORDER) AS TOTAL_ORDER
#FROM ICECREAM_INFO, FIRST_HALF
#WHERE ICECREAM_INFO.FLAVOR = FIRST_HALF.FLAVOR
FROM ICECREAM_INFO JOIN FIRST_HALF USING(FLAVOR)
GROUP BY INGREDIENT_TYPE
ORDER BY 2;
    • 0시부터 23시까지 각 시간대별로 입양이 몇건이나 발생했는지 시간대순으로 정렬하여 출력
SET @HOUR := -1;

SELECT (@HOUR := @HOUR+1) AS HOUR, 
(SELECT COUNT(*) FROM ANIMAL_OUTS WHERE HOUR(DATETIME)=@HOUR) AS COUNT
FROM ANIMAL_OUTS
WHERE @HOUR<23
ORDER BY 1;
    •  자동차 종류 별 특정 옵션이 포함된 수를 자동차 종류 기준 정렬하여 출력
SELECT CAR_TYPE, COUNT(*) AS CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS LIKE "%통풍시트%" OR OPTIONS LIKE "%열선시트%" OR OPTIONS LIKE "%가죽시트%"
GROUP BY CAR_TYPE
ORDER BY 1;
  • 오프라인/온라인 데이터 통합, 오프라인의 유저아이디는 NULL로 출력
SELECT DATE_FORMAT(SALES_DATE,"%Y-%m-%d")AS SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM ONLINE_SALE
WHERE SALES_DATE>="2022-03-1" AND SALES_DATE<"2022-04-01"
UNION ALL
SELECT DATE_FORMAT(SALES_DATE,"%Y-%m-%d")AS SALES_DATE, PRODUCT_ID, NULL AS USER_ID,SALES_AMOUNT
FROM OFFLINE_SALE
WHERE SALES_DATE>="2022-03-1" AND SALES_DATE< "2022-04-01"
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID;
  • 어린 동물 찾기
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION != "AGED"
#WHERE INTAKE_CONDITION <> "AGED"
ORDER BY ANIMAL_ID;
  • 조건에 부합하는 중고거래 댓글 조회
SELECT GB.TITLE, GB.BOARD_ID, GR.REPLY_ID, GR.WRITER_ID, GR.CONTENTS, DATE_FORMAT(GR.CREATED_DATE,"%Y-%m-%d") AS CREATED_DATE
FROM USED_GOODS_BOARD GB JOIN USED_GOODS_REPLY GR USING (BOARD_ID)
WHERE GB.CREATED_DATE>="2022-10-01" AND GB.CREATED_DATE<"2022-11-01"
#WHERE TO_CHAR(GB.CREATED_DATE,"YYYYMM") ="202210" 오류
ORDER BY GR.CREATED_DATE, GB.TITLE;
  • 12세 이하인 여자 환자 출력, 전화번호의 값이 없을 경우 "NONE" 출력
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;
  • 재구매가 일어난 상품과 회원 리스트 출력
SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(*)>1
ORDER BY USER_ID, PRODUCT_ID DESC;
  • 서울에 위치한 식당 출력
SELECT A.REST_ID, REST_NAME, FOOD_TYPE, FAVORITES, ADDRESS, ROUND(AVG(REVIEW_SCORE),2) AS SCORE
FROM REST_INFO A
JOIN REST_REVIEW B USING(REST_ID)
GROUP BY A.REST_ID
HAVING ADDRESS LIKE '서울%'
ORDER BY SCORE DESC, FAVORITES DESC;
  • 2022년 5월에 예약한 환자 수를 진료과코드 별로 조회
SELECT MCDP_CD AS 진료과코드, COUNT(*) AS 5월예약건수
FROM APPOINTMENT
WHERE APNT_YMD LIKE "2022-05%"
GROUP BY 진료과코드
ORDER BY 5월예약건수, 진료과코드;
  • 만원 단위별 상품개수 구하기
SELECT TRUNCATE(PRICE,-4) AS PRICE_GROUP, COUNT(*) AS PRODUCTS
FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP;
  • 특정 일자 기준 대여 여부 컬럼 추가하여 출력
SELECT CAR_ID, MAX(CASE WHEN '2022-10-16' BETWEEN DATE_FORMAT(START_DATE, '%Y-%m-%d') AND DATE_FORMAT(END_DATE, '%Y-%m-%d')
THEN '대여중'
ELSE '대여 가능'
END) AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC;