<<오라클 문법 기록장>>
🔸1. 가격대 별 상품 개수 구하기
https://school.programmers.co.kr/learn/courses/30/lessons/131530?language=oracle
SELECT
FLOOR(PRICE/10000) *10000 AS "PRICE_GROUP",
COUNT(*) AS "PRODUCTS"
FROM PRODUCT
GROUP BY FLOOR(PRICE/10000) *10000
ORDER BY PRICE_GROUP ASC;
POINT!
TRUNC 함수나 FLOOR함수를 사용하면 특정 단위로 숫자를 내림 처리할 수 있다.
TRUNC와 FLOOR의 가장 큰 차이점은 버림할 위치를 정해서 버림할 수 있는지 여부이다
- TRUNCATE: 위치를 지정해서 버릴 수 있는 유연성을 가짐.
- FLOOR: 항상 정수 단위로 버리며, 다른 단위로 버리려면 수학 연산이 필요.
TRUNC vs FLOOR 비교표
| 구분 | TRUNC (TRUNCATE) | FLOOR |
| 기본 기능 | 지정된 위치에서 숫자를 자름. | 주어진 숫자보다 작거나 같은 가장 큰 정수를 반환. |
| 주요 차이 | 소수점 자릿수(양수, 0, 음수)를 지정하여 버릴 위치를 유연하게 제어. | 항상 소수점 아래를 버려 정수 형태로 만듦. |
| 사용 예시 | TRUNC(12345.678, -2) → 12300<br>(백의 자리에서 자름) | FLOOR(12345.678) → 12345<br>(소수점 아래를 버림) |
| 특정 단위 내림 | TRUNC(PRICE, -4)<br>(만원 단위로 내림) | FLOOR(PRICE / 10000) * 10000<br>(만원 단위로 내림) |
🔸2. 자동차 평균 대여 기간 구하기
SELECT
CAR_ID,
TO_CHAR(ROUND(AVG(END_DATE - START_DATE + 1), 1), 'FM9990.0') AS AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
HAVING AVG(END_DATE - START_DATE + 1) >= 7
ORDER BY ROUND(AVG(END_DATE - START_DATE + 1), 1) DESC, CAR_ID DESC;
POINT! 왜 TO_CHAR가 필요했는가?
Oracle에서 숫자를 출력할 때는 데이터의 실제 저장값과 출력 형태가 완전히 별개이다!
즉, 숫자 컬럼을 그대로 SELECT 하면 DB가 알아서 보여주지만, 이때 자동으로 포맷을 맞춰주지는 않는다.
예를 들어 실제값이 7.0일 경우 출력값은 7일수도 있고 7.0일 수도 있다
따라서!
이 문제를 해결하기 위해서 출력할 때 TO_CHAR를 이용해서 원하는 형식으로 강제 변환을 해야한다.
정수와 소수가 섞인 결과를 항상 x.0 형태로 출력하려면 TO_CHAR 사용 필수.
TO_CHAR(7, 'FM9990.0')
- FM → 숫자 앞뒤의 공백 제거 (Fixed Mode)
- 9990.0 →
- 9990 → 정수 자리는 최소 1자리 이상
- .0 → 소수점 첫째 자리 항상 출력
- 9와 0의 의미
| 기호 | 의미 | 특징 |
| 9 | 숫자가 있을 때만 표시 | 값이 없으면 공백으로 처리 |
| 0 | 숫자가 없으면 0으로 표시 | 항상 그 자리를 채움 |
예시)
- 9999 -> 숫자가 없으면 빈 칸 -> 공백이 출력됨
- 0000 -> 빈자리는 0으로 채운다 -> 0000이 출력됨
🔸3. 나머지 문제
1. 조건에 맞는 도서와 저자 리스트 출력하기
https://school.programmers.co.kr/learn/courses/30/lessons/144854?language=oracle
SELECT
B.BOOK_ID,
A.AUTHOR_NAME,
TO_CHAR(B.PUBLISHED_DATE, 'YYYY-MM-DD') AS PUBLISHED_DATE
FROM BOOK B
JOIN AUTHOR A ON B.AUTHOR_ID = A.AUTHOR_ID
WHERE B.CATEGORY = '경제'
ORDER BY PUBLISHED_DATE;
2. 성분으로 구분한 아이스크림 총 주문량
https://school.programmers.co.kr/learn/courses/30/lessons/133026?language=oracle
SELECT
INFO.INGREDIENT_TYPE,
SUM(FH.TOTAL_ORDER) AS "TOTAL_ORDER"
FROM FIRST_HALF FH
JOIN ICECREAM_INFO INFO ON FH.FLAVOR = INFO.FLAVOR
GROUP BY INFO.INGREDIENT_TYPE
3. 상품별 오프라인 매출 구하기
https://school.programmers.co.kr/learn/courses/30/lessons/131533?language=oracle
SELECT
P.PRODUCT_CODE,
SUM(P.PRICE * SALES.SALES_AMOUNT) AS "SALES"
FROM OFFLINE_SALE SALES
JOIN PRODUCT P ON SALES.PRODUCT_ID = P.PRODUCT_ID
GROUP BY P.PRODUCT_CODE
ORDER BY SALES DESC, P.PRODUCT_CODE ASC;
4. 3월에 태어난 여성 회원 목록 출력하기
https://school.programmers.co.kr/learn/courses/30/lessons/131120?language=oracle
SELECT
MEMBER_ID,
MEMBER_NAME,
GENDER,
TO_CHAR(DATE_OF_BIRTH, 'YYYY-MM-DD') AS "DATE_OF_BIRTH"
FROM MEMBER_PROFILE
WHERE TLNO IS NOT NULL
AND EXTRACT(MONTH FROM DATE_OF_BIRTH) = 03
AND GENDER ='W'
ORDER BY MEMBER_ID ASC;
5. 루시와 엘라 찾기
https://school.programmers.co.kr/learn/courses/30/lessons/59046?language=oracle
SELECT
ANIMAL_ID,
NAME,
SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME IN ('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty')
ORDER BY ANIMAL_ID;
6. 조건에 부합하는 중고거래 상태 조회하기
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 TO_CHAR(CREATED_DATE, 'YYYY-MM-DD') = '2022-10-05'
ORDER BY BOARD_ID DESC;
7. 재구매가 일어난 상품과 회원리스트 구하기
SELECT
USER_ID,
PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(*) >= 2
ORDER BY USER_ID ASC, PRODUCT_ID DESC;
'코딩 테스트 > 02. SQL' 카테고리의 다른 글
| [프로그래머스]Oracle SQL_2(Lv3) (0) | 2025.09.20 |
|---|---|
| [프로그래머스] Oracle SQL_1(Lv3) (0) | 2025.09.19 |
| [프로그래머스]Oracle SQL_1(Lv2) (0) | 2025.09.13 |
| [프로그래머스]Oracle SQL(Lv2,10문제) (0) | 2025.09.12 |
| [프로그래머스] Oracle SQL (Lv1, 24문제) (1) | 2025.09.11 |