✔ String, Date
조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기
[프로그래머스 164671]
- CONCAT : 둘 이상의 문자열 값을 입력한 순서대로 합쳐서 반환
/*
SELECT : 첨부파일 경로(/home/grep/src/게시글 ID/파일 ID+파일 이름+파일 확장자)
FROM : USED_GOODS_BOARD, USED_GOODS_FILE 테이블
WHERE : 조회수가 가장 높은 중고거래 게시물
ORDER BY : FILE ID를 기준으로 내림차순 정렬
*/
SELECT CONCAT('/home/grep/src/', A.BOARD_ID, '/', B.FILE_ID, B.FILE_NAME, B.FILE_EXT) AS FILE_PATH
FROM USED_GOODS_BOARD A JOIN USED_GOODS_FILE B
ON A.BOARD_ID = B.BOARD_ID
WHERE VIEWS = (SELECT MAX(VIEWS)
FROM USED_GOODS_BOARD)
ORDER BY B.FILE_ID DESC
특정 옵션이 포함된 자동차 리스트 구하기
[프로그래머스 157343]
/*
SELECT : 자동차 정보 전체
FROM : CAR_RENTAL_COMPANY_CAR 테이블
WHERE : '네비게이션' 옵션이 포함
ORDER BY : 자동차 ID를 기준으로 내림차순 정렬
*/
SELECT *
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS LIKE '%네비게이션%'
ORDER BY CAR_ID DESC
자동차 대여 기록 별 대여 금액 구하기
[프로그래머스 151141]
- DATEDIFF(날짜1, 날짜2) : 두 날짜 간의 일수를 반환
- TIMEDIFF(종료일, 시작일) : 두 기간 사이의 시간을 반환
- PERIOD_DIFF(종료일, 시작일) : 두 기간 사이의 개월 수를 반환
- TIMESTAMPDIFF(단위, 날짜1, 날짜2) : 초(SECOND), 분(MINUTE), 시(HOUR), 일(DAY),
주(WEEK), 월(MONTH), 분기(QUARTER), 연(YEAR)에 따른 차이를 반환
/*
SELECT : 대여 기록 ID, 대여 금액(일일 대여 요금 * 대여 기간 * (100 - 대여 기간에 따른 트럭의 할인율)/100의 정수 부분
이때, 대여 기간이 7일, 30일, 90일 이상이라면 이에 맞춰 할인율 설정
대여 기간이 7일 미만이라면 할인정책이 없음)
FROM : CAR_RENTAL_COMPANY_CAR, CAR_RENTAL_COMPANY_RENTAL_HISTORY, CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블
WHERE : 자동차 종류가 '트럭
ORDER BY : 대여 금액을 기준으로 내림차순 정렬, 같은 경우 대여 기록 ID를 기준으로 내림차순 정렬
*/
SELECT B.HISTORY_ID,
CASE
WHEN DATEDIFF(B.END_DATE, B.START_DATE) + 1 BETWEEN 7 AND 29 THEN
ROUND(A.DAILY_FEE * (DATEDIFF(B.END_DATE, B.START_DATE) + 1) *
(SELECT (100 - DISCOUNT_RATE) / 100
FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN
WHERE CAR_TYPE = '트럭'
AND DURATION_TYPE = '7일 이상'))
WHEN DATEDIFF(B.END_DATE, B.START_DATE) + 1 BETWEEN 30 AND 89 THEN
ROUND(A.DAILY_FEE * (DATEDIFF(B.END_DATE, B.START_DATE) + 1) *
(SELECT (100 - DISCOUNT_RATE) / 100
FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN
WHERE CAR_TYPE = '트럭'
AND DURATION_TYPE = '30일 이상'))
WHEN DATEDIFF(B.END_DATE, B.START_DATE) + 1 >= 90 THEN
ROUND(A.DAILY_FEE * (DATEDIFF(B.END_DATE, B.START_DATE) + 1) *
(SELECT (100 - DISCOUNT_RATE) / 100
FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN
WHERE CAR_TYPE = '트럭'
AND DURATION_TYPE = '90일 이상'))
ELSE ROUND(A.DAILY_FEE * (DATEDIFF(B.END_DATE, B.START_DATE) + 1))
END AS FEE
FROM CAR_RENTAL_COMPANY_CAR A
JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY B
ON A.CAR_ID = B.CAR_ID
WHERE A.CAR_TYPE = '트럭'
ORDER BY FEE DESC, HISTORY_ID DESC
조건에 부합하는 중고거래 상태 조회하기
[프로그래머스 164672]
- CASE : 조건에 따라 다른 동작을 수행하도록 하는 제어 구조
CASE
WHEN 조건 THEN '반환 값'
WHEN 조건 THEN '반환 값'
ELSE 'WHEN 조건에 해당 안되는 경우의 반환 값'
END
/*
SELECT : 게시글 ID, 작성자 ID, 게시글 제목, 가격, 거래상태(SALE 이면 판매중, RESERVED이면 예약중, DONE이면 거래완료 분류)
FROM : USED_GOODS_BOARD 테이블
WEHRE : 2022년 10월 5일에 등록된 중고거래 게시물
ORDER BY : 게시글 ID를 기준으로 내림차순 정렬
*/
SELECT BOARD_ID, WRITER_ID, TITLE, PRICE,
CASE
WHEN STATUS = 'SALE' THEN '판매중'
WHEN STATUS = 'RESERVED' THEN '예약중'
WHEN STATUS = 'DONE' THEN '거래완료'
END AS STATUS
FROM USED_GOODS_BOARD
WHERE CREATED_DATE = '2022-10-05'
ORDER BY BOARD_ID DESC
조건별로 분류하여 주문상태 출력하기
[프로그래머스 131113]
/*
SELECT : 주문 ID, 제품 ID, 출고일자, 출고여부(5월 1일까지 출고완료, 이 후 날짜는 출고 대기, 미정이면 출고미정)
FROM : FOOD_ORDER 테이블
ORDER BY : 주문 ID를 기준으로 오름차순 정렬
*/
SELECT ORDER_ID, PRODUCT_ID, DATE_FORMAT(OUT_DATE, '%Y-%m-%d') AS OUT_DATE,
CASE
WHEN OUT_DATE <= '2022-05-01' THEN '출고완료'
WHEN OUT_DATE > '2022-05-01' THEN '출고대기'
ELSE '출고미정'
END AS '출고여부'
FROM FOOD_ORDER
ORDER BY ORDER_ID
조건에 맞는 사용자 정보 조회하기
[프로그래머스 164670]
- SUBSTRING(원본 문자열, 시작 위치값, 가져올 길이값) : 문자열의 일부를 잘라내어(추출) 반환하는 함수로 SUBSTR과 동일
- LEFT(원본 문자열, 길이) : 왼쪽부터 문자열의 일부를 잘라내어(추출) 반환하는 함수
- RIGHT(원본 문자열, 길이) : 오른쪽부터 문자열의 일부를 잘라내어(추출) 반환하는 함수
/*
SELECT : 사용자 ID, 닉네임, 전체주소(시, 도로명 주소, 상세 주소가 함께 출력), 전화번호(하이픈 문자열을 삽입하여 출력)
FROM : USED_GOODS_BOARD, USED_GOODS_USER 테이블
GROUP BY : 사용자 ID 별
HAVING : 중고 거래 게시물을 3건 이상 등록
ORDER BY : 회원 ID를 기준으로 내림차순 정렬
*/
SELECT B.USER_ID, B.NICKNAME,
CONCAT(B.CITY, ' ', B.STREET_ADDRESS1, ' ', B.STREET_ADDRESS2) AS 전체주소,
CONCAT(SUBSTRING(B.TLNO, 1, 3), '-', SUBSTRING(B.TLNO, 4, 4), '-', SUBSTRING(B.TLNO, 8)) AS 전화번호
FROM USED_GOODS_BOARD A JOIN USED_GOODS_USER B
ON A.WRITER_ID = B.USER_ID
GROUP BY A.WRITER_ID
HAVING COUNT(A.WRITER_ID) >= 3
ORDER BY B.USER_ID DESC
대여 기록이 존재하는 자동차 리스트 구하기
[프로그래머스 157341]
/*
SELECT : 자동차 ID(중복이 없어야 함)
FROM : CAR_RENTAL_COMPANY_CAR, CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블
WHERE : 자동차 종류가 '세단', 10월에 대여를 시작
ORDER BY : 자동차 ID를 기준으로 내림차순 정렬
*/
SELECT DISTINCT(B.CAR_ID)
FROM CAR_RENTAL_COMPANY_CAR A JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY B
ON A.CAR_ID = B.CAR_ID
WHERE A.CAR_TYPE = '세단'
AND B.START_DATE LIKE '%-10-%'
ORDER BY B.CAR_ID DESC
자동차 대여 기록에서 장기/단기 대여 구분하기
[프로그래머스 151138]
/*
SELECT : 자동차 대여 기록 ID, 자동차 ID, 대여 시작일, 대여 종료일, 대여기록(30일 이상이면 '장기 대여' 그렇지 않으면 '단기 대여')
FROM : CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블
WHERE : 2022년 9월에 속하는 대여 기록
ORDER BY : 대여 기록 ID를 기준으로 내림차순 정렬
*/
SELECT HISTORY_ID, CAR_ID, DATE_FORMAT(START_DATE, '%Y-%m-%d'), DATE_FORMAT(END_DATE, '%Y-%m-%d'),
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-%'
ORDER BY HISTORY_ID DESC
자동차 평균 대여 기간 구하기
[프로그래머스 157342]
/*
SELECT : 자동차 ID, 평균 대여 기간(소수점 두번째 자리에서 반올림)
FROM : CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블
GROUP BY : 자동차 ID 별
HAVING : 평균 대여 기간이 7일 이상
ORDER BY : 평균 대여 기간을 기준으로 내림차순 정렬, 같으면 자동차 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 AVG(DATEDIFF(END_DATE, START_DATE) + 1) >= 7
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC
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
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC
취소되지 않은 진료 예약 조회하기
[프로그래머스 132204]
/*
SELECT : 진료예약번호, 환자이름, 환자번호, 진료과코드, 의사이름, 진료예약일시
FROM : PATIENT, DOCTOR, APPOINTMENT 테이블
WHERE : 2022년 4월 13일, 취소되지 않은(N), 흉부외과(CS) 진료 예약 내역
ORDER BY : 진료예약일시를 기준으로 오름차순 정렬
*/
SELECT A.APNT_NO, B.PT_NAME, B.PT_NO, C.MCDP_CD, C.DR_NAME, A.APNT_YMD
FROM APPOINTMENT A
JOIN PATIENT B ON A.PT_NO = B.PT_NO
JOIN DOCTOR C ON A.MDDR_ID = C.DR_ID
WHERE A.APNT_YMD LIKE '2022-04-13%'
AND A.APNT_CNCL_YN = 'N'
AND A.MCDP_CD = 'CS'
ORDER BY A.APNT_YMD
루시와 엘라 찾기
[프로그래머스 59046]
/*
SELECT : 동물의 아이디와 이름, 성별 및 중성화 여부
FROM : ANIMAL_INS 테이블
WHERE : 이름이 Lucy, Ella, Pickle, Rogan, Sabrina, Mitty
*/
SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME IN ('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty')
이름에 el이 들어가는 동물 찾기
[프로그래머스 59047]
/*
SELECT : 개의 아이디와 이름
FROM : ANIMAL_INS 테이블
WHERE : 이름에 "EL"이 들어가는 개
ORDER BY : 이름 순으로 정렬
*/
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE NAME LIKE '%EL%'
AND ANIMAL_TYPE = 'Dog'
ORDER BY NAME
중성화 여부 파악하기
[프로그래머스 59409]
/*
SELECT : 동물의 아이디와 이름, 중성화 여부(중성화가 되어있다면('Neutered' 또는 'Spayed') 'O', 아니라면 'X')
FROM : ANIMAL_INS 테이블
*/
SELECT ANIMAL_ID, NAME, CASE WHEN SEX_UPON_INTAKE LIKE 'Neutered%' OR SEX_UPON_INTAKE LIKE 'Spayed%' THEN 'O'
ELSE 'X'
END AS '중성화'
FROM ANIMAL_INS
오랜 기간 보호한 동물(2)
[프로그래머스 59411]
/*
SELECT : 아이디와 이름
FROM : ANIMAL_INS, ANIMAL_OUTS 테이블 (RIGHT OUTER JOIN)
WHERE : 입양을 간 동물 중, 보호 기간이 가장 길었던 동물
ORDER BY : 보호 기간이 긴 순으로 정렬
*/
SELECT A.ANIMAL_ID, A.NAME
FROM ANIMAL_OUTS A RIGHT OUTER JOIN ANIMAL_INS B
ON A.ANIMAL_ID = B.ANIMAL_ID
ORDER BY A.DATETIME - B.DATETIME DESC
LIMIT 2
카테고리 별 상품 개수 구하기
[프로그래머스 131529]
/*
SELECT : 상품 카테고리 코드(PRODUCT_CODE 앞 2자리), 상품 개수
FROM : PRODUCT 테이블
GROUP BY : 상품 카테고리 코드
ORDER BY : 상품 카테고리 코드를 기준으로 오름차순 정렬
*/
SELECT LEFT(PRODUCT_CODE, 2) AS CATEGORY, COUNT(PRODUCT_ID) AS PRODUCTS
FROM PRODUCT
GROUP BY CATEGORY
ORDER BY CATEGORY
DATETIME에서 DATE로 형 변환
[프로그래머스 59414]
/*
SELECT : 동물의 아이디, 이름, 들어온 날짜(시각(시-분-초)을 제외한 날짜(년-월-일))
FROM : ANIMAL_INS 테이블
ORDER BY : 아이디 순으로 정렬
*/
SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME, '%Y-%m-%d') AS 날짜
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
연도 별 평균 미세먼지 농도 조회하기
[프로그래머스 284530]
/*
SELECT : 연도 별 평균 미세먼지 오염도(소수 셋째 자리에서 반올림), 평균 초미세먼지 오염도(소수 셋째 자리에서 반올림)
FROM : AIR_POLLUTION 테이블
GROUP BY : 연도, 지역구분1, 지역구분2 별
HAVING : 지역구분2가 수원
ORDER BY : 연도를 기준으로 오름차순 정렬
*/
SELECT YEAR(YM) AS YEAR, ROUND(AVG(PM_VAL1), 2) AS 'PM10', ROUND(AVG(PM_VAL2), 2) AS 'PM2.5'
FROM AIR_POLLUTION
GROUP BY YEAR, LOCATION1, LOCATION2
HAVING LOCATION2 = '수원'
ORDER BY YEAR;
한 해에 잡은 물고기 수 구하기
[프로그래머스 298516]
/*
SELECT : 물고기 수
FROM : FISH_INFO 테이블
WHERE : 2021년도에 잡은 물고기
*/
SELECT COUNT(*) AS FISH_COUNT
FROM FISH_INFO
WHERE YEAR(TIME) = 2021
분기별 분화된 대장균의 개체 수 구하기
[프로그래머스 299308]
/*
SELECT : 각 분기('Q'를 붙임), 분기별 분화된 대장균의 개체의 총 수
FROM : ECOLI_DATA 테이블
GROUP BY : 분기별(1(1, 2, 3), 2(4, 5, 6), 3(7, 8, 9), 4(10, 11, 12))
ORDER BY : 분기에 대해 오름차순으로 정렬
*/
SELECT CONCAT(CEIL(MONTH(DIFFERENTIATION_DATE) / 3), 'Q') AS QUARTER, COUNT(ID) AS ECOLI_COUNT
FROM ECOLI_DATA
GROUP BY QUARTER
ORDER BY QUARTER
SELECT CASE WHEN MONTH(DIFFERENTIATION_DATE) <= 3 THEN '1Q'
WHEN MONTH(DIFFERENTIATION_DATE) <= 6 THEN '2Q'
WHEN MONTH(DIFFERENTIATION_DATE) <= 9 THEN '3Q'
ELSE '4Q'
END AS QUARTER, COUNT(1) AS ECOLI_COUNT
FROM ECOLI_DATA
GROUP BY QUARTER
ORDER BY QUARTER