📕 SQL/MySQL
📕[SQL] 24.08.14 SQL
혜덕hyeduck
2024. 8. 14. 19:27
SQL ) LV1. 자동차 대여 기록에서 장기/단기 대여 구분하기
관련 개념
- 날짜 차이를 구하는 함수
- DATEDIFF(날짜1, 날짜2)
- (날짜1 - 날짜2) 값을 일로 반환
- TIMESTAMPDIFF(단위, 날짜1, 날짜2)
- (날짜2 - 날짜1) 값을 단위로 치환해서 반환
- 예를 들어, 단위가 SECOND라면 두 날짜 차이를 초로 치환
- 단위
- YEAR
- MONTH
- WEEK
- DAY
- HOUR
- MINUTE
- SECOND
- QUARTER
- (날짜2 - 날짜1) 값을 단위로 치환해서 반환
- DATEDIFF(날짜1, 날짜2)
접근법
- 조건절에서 2022년 09월인 데이터로 제한을 두고, SELECT절에서 CASE문과 DATEDIFF를 통해 END_DATE와 START_DATE간 차이값 + 1이 30일 이상인 경우 장기 대여, 그 외에는 단기 대여인 값을 갖는 RENT_TYPE칼럼을 추가
코드
SELECT HISTORY_ID, CAR_ID, DATE_FORMAT(START_DATE, "%Y-%m-%d") START_DATE, DATE_FORMAT(END_DATE, "%Y-%m-%d") END_DATE,
CASE
WHEN DATEDIFF(END_DATE, START_DATE) + 1 >= 30 THEN '장기 대여'
ELSE '단기 대여'
END AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE YEAR(START_DATE) = 2022 AND MONTH(START_DATE) = 09
ORDER BY HISTORY_ID DESC;
SQL ) LV1. 평균 일일 대여 요금 구하기
접근법
- WHERE절에서 CAR_TYPE이 ‘세단’인 데이터만 조회되도록 조건 추가 후,
- SELECT절에서 해당 데이터들의 DAILY_FEE의 평균AVG 값을 ROUND함수를 통해 소수 첫째 자리에서 반올림해서 보이도록 했다.
코드
SELECT ROUND(AVG(DAILY_FEE), 0) AS AVERAGE_FEE FROM CAR_RENTAL_COMPANY_CAR WHERE CAR_TYPE = 'SUV';
SQL ) LV1. 조건에 맞는 도서 리스트 출력하기
접근법
- WHERE 절에서 PUBLISHED_DATE의 년도가 2021이고, CATEGORY가 인문인 데이터 조회
코드
SELECT BOOK_ID, DATE_FORMAT(PUBLISHED_DATE, "%Y-%m-%d") AS PUBLISHED_DATE FROM BOOK
WHERE YEAR(PUBLISHED_DATE) = 2021 AND CATEGORY = '인문'
ORDER BY PUBLISHED_DATE ASC;
SQL ) LV1. 과일로 만든 아이스크림 고르기
접근법
- 상반기 주문 정보를 담은 FIRST_HALF테이블과 아이스크림 성분 정보를 담은 ICECREAM_INFO 테이블을 FLAVOR칼럼을 기준으로 INNER JOIN
- 이때, TOTAL_ORDER값이 3000보다 크고, INGREDIENT_TYPE이 'fruit_based'인 데이터만 조회
코드
SELECT F.FLAVOR FROM FIRST_HALF F JOIN ICECREAM_INFO I ON F.FLAVOR = I.FLAVOR
WHERE TOTAL_ORDER > 3000 AND I.INGREDIENT_TYPE = 'fruit_based'
ORDER BY TOTAL_ORDER DESC;
SQL ) LV1. 인기있는 아이스크림
코드
SELECT FLAVOR FROM FIRST_HALF ORDER BY TOTAL_ORDER DESC, SHIPMENT_ID ASC;
SQL ) LV1. 흉부외과 또는 일반외과 의사 목록 출력하기
접근법
- MCDP_CD가 ‘CS’거나 ‘GS’인 데이터를 조회해야 하므로 WHERE절에서 IN 연산자 사용함
코드
SELECT DR_NAME, DR_ID, MCDP_CD, DATE_FORMAT(HIRE_YMD, '%Y-%m-%d')
FROM DOCTOR WHERE MCDP_CD IN ('CS', 'GS')
ORDER BY HIRE_YMD DESC, DR_NAME ASC;
SQL ) LV1. 12세 이하인 여자 환자 목록 출력하기
접근법
- 환자 AGE가 12이하이면서 환자 GEND_CD가 ‘W’인 데이터 조회
- 이때, TLNO칼럼 값이 NULL일 경우 NONE으로 치환해서 보임 → IFNULL 함수 사용
코드
SELECT PT_NAME, PT_NO, GEND_CD, AGE, IFNULL(TLNO, 'NONE') TLNO FROM PATIENT
WHERE AGE <= 12 AND GEND_CD = 'W'
ORDER BY AGE DESC, PT_NAME ASC;
SQL ) LV1. 가장 비싼 상품 구하기
접근법
- MAX함수를 사용해 가장 높은 판매가 출력
코드
SELECT MAX(PRICE) MAX_PRICE FROM PRODUCT;
SQL ) LV1. 조건에 맞는 회원수 구하기
관련 개념
- BETWEEN a AND b
- 범위 a ~ b에 속하는 데이터 조회
- NOTBETWEEN a AND b
- 범위 a~b사이에 해당하지 않는 데이터 조회
접근법
- 가입날짜 년도는 년도 추출 함수 YEAR을 사용해 반환값이 2021인 경우만 조회
- 나이 AGE가 20~29여야 하므로BETWEEN AND 연산자 사용해서 조회
코드
SELECT COUNT(*) USERS FROM USER_INFO WHERE YEAR(JOINED) = 2021 AND AGE BETWEEN 20 AND 29;
SQL ) LV1. 나이 정보가 없는 회원 수 구하기
접근법
- AGE가 NULL인 데이터 조회 ⇒ IS NULL
코드
SELECT COUNT(*) AS USERS FROM USER_INFO WHERE AGE IS NULL;
SQL ) LV1. 경기도에 위치한 식품창고 목록 출력하기
접근법
- 주소ADDRESS가 경기도인 데이터만 조회해야하므로 LIKE연산자로 경기도로 시작하는 데이터만 조회하도록 했다.
- 또한, FREEZER_YN칼럼 값이 NULL인 경우 ‘N’으로 표기하도록 IFNULL함수를 사용했다.
코드
SELECT WAREHOUSE_ID, WAREHOUSE_NAME, ADDRESS, IFNULL(FREEZER_YN, 'N') AS FREEZER_YN
FROM FOOD_WAREHOUSE
WHERE ADDRESS LIKE '경기도%'
ORDER BY 1 ASC;