프로그래머스 문제풀이
1. SELECT 문
-- 아픈동물 찾기
SELECT ANIMAL_ID, NAME FROM ANIMAL_INS
WHERE INTAKE_CONDITION = 'Sick'
OERDER BY ANIMAL_ID;
-- 어린 동물 찾기
SELECT ANIMAL_ID, NAME FROM ANIMAL_INS
WHERE INTAKE_CONDITION != "Aged"
ORDER BY ANIMAL_ID;
-- 동물의 아이디와 이름
SELECT ANIMAL_ID, NAME FROM ANIMAL_INS
ORDER BY ANIMAL_ID;
-- 여러 기준으로 정렬하기
-- 코드를 입력하세요
SELECT ANIMAL_ID,NAME,DATETIME FROM ANIMAL_INS
ORDER BY NAME ASC, DATETIME DESC;\
-- 상위 N개 레코드
SELECT NAME FROM ANIMAL_INS
ORDER BY DATETIME ASC
LIMIT 1; -- 제일위에 1개
-- 조건에 맞는 회원수 구하기
-- 코드를 입력하세요
SELECT COUNT(*) AS USERS FROM USER_INFO
WHERE AGE>=20 AND AGE <= 29 AND YEAR(JOINED) = 2021;
SUM, MAX, MIN
-- 최댓값 구하기
SELECT MAX(DATETIME) AS DATETIME
FROM ANIMAL_INS
-- 최솟값 구하기
SELECT MIN(DATETIME) AS DATETIME
FROM ANIMAL_INS
-- 동물 수 구하기
SELECT COUNT(*) AS count
FROM ANIMAL_INS
-- 중복 제거하기
SELECT COUNT(DISTINCT NAME) AS COUNT FROM ANIMAL_INS
WHERE NAME IS NOT NULL;
GROUP BY
-- 고양이와 개는 몇 마리 있을까
SELECT ANIMAL_TYPE, COUNT(*) AS count -- ANIMAL타입과, COUNT해라
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE -- ANIMAL 타입으로 묶어라
ORDER BY ANIMAL_TYPE -- ANIMAL 타입으로 정렬해라
-- 동명 동물 수 찾기
SELECT NAME, COUNT(*) AS 'COUNT' FROM ANIMAL_INS -- AS별칭 ''로 구분
GROUP BY NAME -- 이름으로 구분하기
HAVING COUNT (NAME)>1 -- HAVING 절로 2회 이상만 구분하기
ORDER BY NAME
-- 입양 시각 구하기
SELECT HOUR(DATETIME) AS 'HOUR', COUNT(*) AS 'COUNT' -- HOUR(DATETIME) 으로 HOUR만 조회
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) >= 9 AND HOUR(DATETIME)<20 -- WHERE로 조건 주고 저건에 맞는거만
GROUP BY HOUR -- 시간으로 묶기
ORDER BY HOUR -- 시간순서대로 정렬하기
-- 가격대 별 상품 개수 구하기
SELECT (CASE
WHEN PRICE BETWEEN 0 AND 9999 THEN '0'
WHEN PRICE BETWEEN 10000 AND 19999 THEN '10000'
WHEN PRICE BETWEEN 20000 AND 29999 THEN '20000'
WHEN PRICE BETWEEN 30000 AND 39999 THEN '30000'
WHEN PRICE BETWEEN 40000 AND 49999 THEN '40000'
WHEN PRICE BETWEEN 50000 AND 59999 THEN '50000'
WHEN PRICE BETWEEN 60000 AND 69999 THEN '60000'
WHEN PRICE BETWEEN 70000 AND 79999 THEN '70000'
WHEN PRICE BETWEEN 10000 AND 89999 THEN '80000'
END) AS 'PRICE_GROUP', COUNT(*) AS 'PRODUCTS'-- MAX값이 85000이었다
FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP
-- 진료과별 총 예약 횟수 출력하기
SELECT MCDP_CD AS '진료과코드', COUNT(MCDP_CD) AS '5월예약건수' FROM APPOINTMENT
-- MCDP_CD 는 '진료과 코드로' MCDP_CD를 COUNT한거는 5D월 에약선수로
WHERE APNT_YMD LIKE '%2022-05%' -- 어떻게? 5월꺼기준으로
GROUP BY MCDP_CD -- MCDP_CD를 기준으로 묶고
ORDER BY COUNT(MCDP_CD) ASC, MCDP_CD -- 둘다 오름차순
-- 자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기
SELECT CAR_TYPE, COUNT(*) AS 'CARS' FROM CAR_RENTAL_COMPANY_CAR
WHERE (OPTIONS LIKE '%통풍시트%') OR (OPTIONS LIKE '%열선시트%') OR (OPTIONS LIKE '%가죽시트%') -- COUNT해라 WHERE조건문에 맞도록
GROUP BY CAR_TYPE
ORDER BY CAR_TYPE ASC
-- 성분으로 구분한 아이스크림 총 주문량
SELECT ICECREAM_INFO.INGREDIENT_TYPE, SUM (FIRST_HALF.TOTAL_ORDER) AS 'TOTAL_ORDER' FROM ICECREAM_INFO, FIRST_HALF
-- 아이스크림 정보 테이블의 TYPE을 선택해서, FIRST_HALF의 비용을 더하고
WHERE ICECREAM_INFO.FLAVOR = FIRST_HALF.FLAVOR
-- 만약 ICECREAM 정보 탭의 맛과, FIRST 탭의 맛이 같은것들만
GROUP BY INGREDIENT_TYPE
ORDER BY TOTAL_ORDER
IS NULL
-- 경기도에 위치한 식품창고 목록 출력하기
SELECT WAREHOUSE_ID, WAREHOUSE_NAME, ADDRESS,
CASE WHEN FREEZER_YN IS NULL THEN 'N' ELSE FREEZER_YN END
-- 만약에 FREEZER_YN이 NULL 이면 N 으로 바꾸고 나머지는 그대로
FROM FOOD_WAREHOUSE
WHERE ADDRESS LIKE '%경기도%' -- 주소가 경기도인거만 고르기
ORDER BY WAREHOUSE_ID ASC -- 저장소 ID가 오름차순
-- 이름이 없는 동물의 아이디
SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NULL -- NAME이 NULL인거만 찾기
ORDER BY ANIMAL_ID ASC -- 오름차순
-- 이름이 있는 동물의 아이디
SELECT ANIMAL_ID FROM ANIMAL_INS
WHERE NAME IS NOT NULL
ORDER BY ANIMAL_ID ASC
-- 나이 정보가 없는 회원수 구하기
SELECT COUNT(*) AS 'USERS' FROM USER_INFO
WHERE AGE IS NULL
-- NULL 처리하기
SELECT ANIMAL_TYPE,
IFNULL(NAME, 'No name') as NAME, SEX_UPON_INTAKE FROM ANIMAL_INS
-- 만약 NAME이 NULL 이면 No name으로 바꿔라
ORDER BY ANIMAL_ID ASC
JOIN
-- 조건에 맞는 도서와 저자 리스트 출력하기
SELECT BOOK_ID, AUTHOR_NAME,
DATE_FORMAT(PUBLISHED_DATE, "%Y-%m-%d") AS PUBLISHED_DATE
-- DATE_FORMAT 맞춰주기
FROM BOOK JOIN AUTHOR
ON BOOK.AUTHOR_ID = AUTHOR.AUTHOR_ID
-- AUTHOR_ID를 기준으로 BOOK 테이블과 AUTHOR 테이블 조인 하기
WHERE BOOK.CATEGORY = '경제'
-- 그 중에서도 CATEGORY는 경제여야 한다
ORDER BY PUBLISHED_DATE
-- 상품 별 오프라인 매출 구하기
SELECT PRODUCT_CODE, SUM(PRICE * SALES_AMOUNT) AS SALES
-- PRICE 랑 SALES_AMOUNT는 중복되지 않으니까 그냥
FROM PRODUCT
JOIN OFFLINE_SALE
ON PRODUCT.PRODUCT_ID = OFFLINE_SALE.PRODUCT_ID
-- 뭐를 기준으로 JOIN 할껀지
GROUP BY PRODUCT_CODE
-- PRODUCT_CODE를 그룹으로
ORDER BY SALES DESC, PRODUCT_CODE ASC
-- SALES를 기준으로 내림차순, 만약 동일하면 PRODUCT_CODE를 기준으로 오름차순
String, Data
-- 조건에 부합하는 중고거래 상태 조회하기
SELECT BOARD_ID, WRITER_ID, TITLE, PRICE,
CASE WHEN STATUS = 'SALE' THEN '판매중'
WHEN STATUS = 'RESERVED' THEN '예약중'
WHEN STATUS = 'DONE' THEN '거래완료' END STATUS
-- STATUS의 상태에 따라 바꿔주기 CASE WHEN으로
FROM USED_GOODS_BOARD
WHERE CREATED_DATE = '2022-10-5'
-- 10월 5일날짜만 찾기
ORDER BY BOARD_ID DESC
-- ID기준 내림차순
-- 자동차 평균 대여기간 구하기
SELECT CAR_ID, ROUND(AVG((DATEDIFF(END_DATE,START_DATE)+1)),1) AS AVERAGE_DURATION
-- 날짜 차이 구하고, 평균 소수점 둘째 자리에서 반올림
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
HAVING AVERAGE_DURATION >= 7
-- 평균 대여일수 7일 이상
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC
-- 자동차 대여 기록에서 장기/단기 대여 구분하기
SELECT HISTORY_ID, CAR_ID,
DATE_FORMAT(START_DATE,"%Y-%m-%d") AS START_DATE,
DATE_FORMAT(END_DATE, "%Y-%m-%d") AS END_DATE,
-- DATE_FORMAT으로 바꿔주기 형식을 안맞추면 시간까지 나온다
CASE WHEN DATEDIFF(END_DATE, START_DATE)+1 >= 30 THEN '장기 대여'
-- 두 날짜의 차이로 장,단기 구분
ELSE '단기 대여'
END AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE LIKE "2022-09%"
-- 9월꺼만 찾기
ORDER BY HISTORY_ID DESC
-- 특정 옵션이 포함된 자동차 리스트 구하기
SELECT CAR_ID, CAR_TYPE, DAILY_FEE, OPTIONS
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS LIKE '%네비게이션%'
ORDER BY CAR_ID DESC
-- 루시와 엘라 찾기
SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME IN('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty')
ORDER BY ANIMAL_ID
-- 이름에 el이 들어가는 동물 찾기
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE NAME LIKE '%EL%' and ANIMAL_TYPE = 'Dog'
-- 이름에 EL이 들어가고, TYPE이 DOG
ORDER BY NAME ASC
-- 중성화 여부 파악하기
SELECT ANIMAL_ID, NAME,
CASE WHEN SEX_UPON_INTAKE LIKE '%Neutered%' or
SEX_UPON_INTAKE LIKE '%Spayed%'
then 'O'
else 'X'
END SEX_UPON_INTAKE
FROM ANIMAL_INS
-- DATETIME에서 DATE로 형 변환
SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME, '%Y-%m-%d') as '날짜'
FROM ANIMAL_INS
--카테고리 별 상품 개수 구하기
SELECT
LEFT(PRODUCT_CODE, 2) AS CATEGORY,
COUNT(PRODUCT_ID) AS PRODUCTS
FROM PRODUCT
GROUP BY CATEGORY
ORDER BY CATEGORY ASC
댓글