본문 바로가기
코딩테스트/SQL

SELECT > 서울에 위치한 식당 목록 출력하기 / MySQL 소수점 관련 주요 함수

by imsha 2025. 3. 25.

문제 설명

다음은 식당의 정보를 담은 REST_INFO 테이블과 식당의 리뷰 정보를 담은 REST_REVIEW 테이블입니다. REST_INFO테이블은 다음과 같으며 REST_ID, REST_NAME, FOOD_TYPE, VIEWS, FAVORITES, PARKING_LOT, ADDRESS, TEL은 식당 ID, 식당 이름, 음식 종류, 조회수, 즐겨찾기수, 주차장 유무, 주소, 전화번호를 의미합니다.

Column name Type Nullable
REST_ID VARCHAR(5) FALSE
REST_NAME VARCHAR(50) FALSE
FOOD_TYPE VARCHAR(20) TRUE
VIEWS NUMBER TRUE
FAVORITES NUMBER TRUE
PARKING_LOT VARCHAR(1) TRUE
ADDRESS VARCHAR(100) TRUE
TEL VARCHAR(100) TRUE

 

REST_REVIEW 테이블은 다음과 같으며 REVIEW_ID, REST_ID, MEMBER_ID, REVIEW_SCORE, REVIEW_TEXT,REVIEW_DATE는 각각 리뷰 ID, 식당 ID, 회원 ID, 점수, 리뷰 텍스트, 리뷰 작성일을 의미합니다.

Column name Type Nullable
REVIEW_ID VARCHAR(10) FALSE
REST_ID VARCHAR(10) TRUE
MEMBER_ID VARCHAR(100) TRUE
REVIEW_SCORE NUMBER TRUE
REVIEW_TEXT VARCHAR(1000) TRUE
REVIEW_DATE DATE TRUE

문제

REST_INFO와 REST_REVIEW 테이블에서 서울에 위치한 식당들의 식당 ID, 식당 이름, 음식 종류, 즐겨찾기수, 주소, 리뷰 평균 점수를 조회하는 SQL문을 작성해주세요. 이때 리뷰 평균점수는 소수점 세 번째 자리에서 반올림 해주시고 결과는 평균점수를 기준으로 내림차순 정렬해주시고, 평균점수가 같다면 즐겨찾기수를 기준으로 내림차순 정렬해주세요.

SELECT 
        RI.REST_ID,
        RI.REST_NAME,
        RI.FOOD_TYPE,
        RI.FAVORITES, 
        RI.ADDRESS,
        ROUND(AVG(RR.REVIEW_SCORE),2) AS SCORE 
FROM
        REST_REVIEW RR
        LEFT JOIN REST_INFO RI 
            ON  RI.REST_ID = RR.REST_ID
WHERE
        RI.ADDRESS LIKE "서울%"
GROUP BY
        RI.REST_ID,
        RI.REST_NAME,
        RI.FOOD_TYPE,
        RI.FAVORITES, 
        RI.ADDRESS
  
ORDER BY
        AVG(RR.REVIEW_SCORE) DESC,
        RI.FAVORITES DESC

 


학습

MySQL 소수점 관련 주요 함수

1. ROUND(X[, D])

  • 설명: 숫자 X를 소수점 D 자리까지 반올림.
-- ROUND(반올림) 예시
SELECT ROUND(123.4567, 2); 
-- 결과: 123.46 SELECT ROUND(123.4567); -- 결과: 123 (D 생략 시 0자리)

2. TRUNCATE(X, D)

  • 설명: 숫자 X를 소수점 D 자리까지만 남기고 나머지는 버림 (반올림 아님).
--TRUNCATE(버림) 예시
SELECT TRUNCATE(123.4567, 2); 
-- 결과: 123.45

3. CEIL(X) 또는 CEILING(X)

  • 설명: 숫자 X를 올림해서 정수로 반환.
-- CEIL,CELING(올림&정수) 예시
SELECT CEIL(123.45); -- 결과: 124 
SELECT CEILING(-1.2); -- 결과: -1

4. FLOOR(X)

  • 설명: 숫자 X를 내림해서 정수로 반환.
-- FLOOR(내림&정수) 예시
SELECT FLOOR(123.45); -- 결과: 123 
SELECT FLOOR(-1.2); -- 결과: -2

5. FORMAT(X, D)

  • 설명: 숫자 X를 소수점 D자리까지 문자열로 포맷 (천 단위 콤마 포함).
  •  
-- FORMAT(문자열로 변환) 예시
SELECT FORMAT(12345.6789, 2); 
-- 결과: '12,345.68'

6. MOD(X, Y) 또는 X % Y

  • 설명: X를 Y로 나눈 나머지를 반환. 소수 연산도 가능.
  •  
-- MOD(나눈나머지) 예시
SELECT MOD(10.5, 3); -- 결과: 1.5

7. CAST(X AS DECIMAL(D1, D2))

  • 설명: 숫자 X를 소수점 자리수 지정해 DECIMAL 형식으로 캐스팅.
  •  
--CAST(형변환) 예시
SELECT CAST(123.456 AS DECIMAL(6,2)); 
-- 결과: 123.46

📘 DECIMAL(6,2)의 의미

전체 자리수 6 소수점 포함한 전체 자릿수 (정수 + 소수)
소수 자리수 2 소수점 이하 자릿수
정수 자리수 4 6 - 2 = 4 (소수점 앞 자릿수 최대 4자리까지 가능)

보너스: 소수점 조작 시 자주 쓰이는 조합

-- 소수점 둘째 자리까지 반올림 후 정수로
SELECT FLOOR(ROUND(123.456, 1)); -- 결과: 123
-- 소수점 아래 3자리까지 잘라내기 (반올림 없이)
SELECT TRUNCATE(987.654321, 3); -- 결과: 987.654

댓글