본문 바로가기

데이터베이스/Oracle

[MySQL/level 4] 그룹별 조건에 맞는 식당 목록 출력하기 - 131124 (MySQL vs. Oracle, DATE_FORMAT vs. TO_CHAR, LIMIT vs. ROWNUM)

문제

MEMBER_PROFILE REST_REVIEW 테이블에서 리뷰를 가장 많이 작성한 회원의 리뷰들을 조회하는 SQL문을 작성해주세요. 회원 이름, 리뷰 텍스트, 리뷰 작성일이 출력되도록 작성해주시고, 결과는 리뷰 작성일을 기준으로 오름차순, 리뷰 작성일이 같다면 리뷰 텍스트를 기준으로 오름차순 정렬해주세요.

 

DATE_FORMAT

  • DATE_FORMAT(date, format)

Parameter Description
date Required. The date to be formatted
format Required. The format to use. Can be one or a combination of the following values:

 

Format  Description
%a Abbreviated weekday name (Sun to Sat)
%b Abbreviated month name (Jan to Dec)
%c Numeric month name (0 to 12)
%D Day of the month as a numeric value, followed by suffix (1st, 2nd, 3rd, ...)
%d Day of the month as a numeric value (01 to 31)
%e Day of the month as a numeric value (0 to 31)
%f Microseconds (000000 to 999999)
%H Hour (00 to 23)
%h Hour (00 to 12)
%I Hour (00 to 12)
%i Minutes (00 to 59)
%j Day of the year (001 to 366)
%k Hour (0 to 23)
%l Hour (1 to 12)
%M Month name in full (January to December)
%m Month name as a numeric value (00 to 12)
%p AM or PM
%r Time in 12 hour AM or PM format (hh:mm:ss AM/PM)
%S Seconds (00 to 59)
%s Seconds (00 to 59)
%T Time in 24 hour format (hh:mm:ss)
%U Week where Sunday is the first day of the week (00 to 53)
%u Week where Monday is the first day of the week (00 to 53)
%V Week where Sunday is the first day of the week (01 to 53). Used with %X
%v Week where Monday is the first day of the week (01 to 53). Used with %x
%W Weekday name in full (Sunday to Saturday)
%w Day of the week where Sunday=0 and Saturday=6
%X Year for the week where Sunday is the first day of the week. Used with %V
%x Year for the week where Monday is the first day of the week. Used with %v
%Y Year as a numeric, 4-digit value
%y Year as a numeric, 2-digit value

 

LIMIT vs. ROWNUM

 

구분 MySQL LIMIT Oracle ROWNUM
정의 쿼리의 결과에서 반환할 행의 개수 또는 시작 위치를 정합니다. 쿼리의 결과에서 각 행에 대해 행 번호를 매기는 가상 컬럼입니다. 이 번호는 쿼리 결과가 반환될 때 할당되며, 처음에 조건으로 사용하여 반환할 행 수를 제한할 수 있습니다.
구문 LIMIT 오프셋, 행 수 WHERE ROWNUM <= 숫자
예시 SELECT * FROM 테이블 LIMIT 10;
-> 결과의 처음 10개 행 반환

SELECT * FROM 테이블 LIMIT 5, 10;
-> 6번째 행부터 10개 행 반환
SELECT * FROM 테이블 WHERE ROWNUM <= 10;
-> 결과의 처음 10개 행 반환

ROWNUM은 쿼리 실행 순서에 따라 행 번호를 매기기 때문에, 특정 오프셋을 적용하려면 서브쿼리를 이용해야 합니다.

SELECT * FROM
(SELECT A.*, ROWNUM RNUM FROM 테이블 A
WHERE ROWNUM <=15)
WHERE ROWNUM >= 6;
-> 6번째 행부터 10개 행 반환

 

MySQL - code

SELECT M.MEMBER_NAME, R.REVIEW_TEXT, DATE_FORMAT(R.REVIEW_DATE, '%Y-%m-%d') AS REVIEW_DATE
FROM MEMBER_PROFILE M JOIN REST_REVIEW R ON M.MEMBER_ID = R.MEMBER_ID
WHERE M.MEMBER_ID = (SELECT MEMBER_ID
                    FROM REST_REVIEW
                    GROUP BY MEMBER_ID
                    ORDER BY COUNT(REVIEW_ID) DESC LIMIT 1)
ORDER BY REVIEW_DATE, REVIEW_TEXT
  • 문제 조건 2. 회원 이름, 리뷰 텍스트, 리뷰 작성일 조회합니다.
    • 리뷰 작성일 포맷: yyyy-mm-dd => %Y-%m-%d
      • SELECT M.MEMBER_NAME, R.REVIEW_TEXT, DATE_FORMAT(R.REVIEW_DATE, '%Y-%m-%d') AS REVIEW_DATE
    • MEMBER_ID를 기준으로 JOIN 수행합니다.
      • FROM MEMBER_PROFILE M JOIN REST_REVIEW ON M.MEMBER_ID = R.MEMBER_ID
  • 문제 조건 3. 리뷰 작성일을 기준으로 오름차순, 리뷰 텍스트를 기준으로 오름차순입니다.
    • ORDER BY REVIEW_DATE, REVIEW_TEXT
  • 문제 조건 1. 리뷰를 가장 많이 작성한 회원의 리뷰 조건입니다.
    • WHERE M.MEMBER_ID = : 회원의 리뷰를 봐야하기 때문에 MEMBER_ID를 기준으로 조건을 겁니다.
    • (SELECT MEMBER_ID
       FROM REST_REVIEW
       GROUP BY MEMBER_ID
       ORDER BY COUNT(REVIEW_ID) DESC LIMIT 1)
      • REST_REVIEW 테이블에서 MEMBER_ID를 그룹화하여, 각 MEMBER_ID에 속한 리뷰 수를 집계합니다.
      • 리뷰 수가 많은대로 순서대로 정렬합니다.
      • 그 중 가장 상위의 한 개의 MEMBER_ID만 선택합니다.

 

Oracle - code

본 문제에 대해 현재 프로그래머스에서 MySQL만 지원하기 때문에 직접 테이블을 만들어서 풀어보았습니다.

SQL> CREATE TABLE MEMBER_PROFILE
  2  (
  3   MEMBER_ID VARCHAR(100),
  4   MEMBER_NAME VARCHAR(50),
  5   TLNO VARCHAR(50) NOT NULL,
  6   GENDER VARCHAR(1) NOT NULL,
  7   DATE_OF_BIRTH DATE NOT NULL
  8  );
테이블이 생성되었습니다.

SQL> INSERT INTO MEMBER_PROFILE VALUES ('jiho92@naver.com', '이지호', '01076432111', 'W', '1992-02-12');
1 개의 행이 만들어졌습니다.
.
.
.



SQL> CREATE TABLE REST_REVIEW
  2  (
  3   REVIEW_ID VARCHAR(10),
  4   REST_ID VARCHAR(10) NOT NULL,
  5   MEMBER_ID VARCHAR(100) NOT NULL,
  6   REVIEW_SCORE NUMBER NOT NULL,
  7   REVIEW_TEXT VARCHAR(1000) NOT NULL,
  8   REVIEW_DATE DATE NOT NULL
  9  );
테이블이 생성되었습니다.

SQL> INSERT INTO REST_REVIEW VALUES ('R000000065', '00028', 'soobin97@naver.com', 5, ' 부찌 국물에서 샤브샤브 맛이나고 깔끔', '2022-04-12');
1 개의 행이 만들어졌습니다.
.
.
.

SQL> SELECT M.MEMBER_NAME, R.REVIEW_TEXT, TO_CHAR(R.REVIEW_DATE, 'yyyy-mm-dd') AS REVIEW_DATE
  2  FROM MEMBER_PROFILE M JOIN REST_REVIEW R ON M.MEMBER_ID = R.MEMBER_ID
  3  WHERE M.MEMBER_ID = (SELECT MEMBER_ID
  4                       FROM (SELECT MEMBER_ID
  5                             FROM REST_REVIEW
  6                             GROUP BY MEMBER_ID
  7                             ORDER BY COUNT(MEMBER_ID) DESC)
  8                       WHERE ROWNUM = 1)
  9  ORDER BY R.REVIEW_DATE, R.REVIEW_TEXT;

+------------+--------------------------+------------+
| MEMBER_NAME|       REVIEW_TEXT         | REVIEW_DATE|
+------------+--------------------------+------------+
| 조예린     | 김치찌개 최곱니다.         | 2022-02-12 |
| 조예린     | 햄이 많아서 좋아요         | 2022-02-22 |
+------------+--------------------------+------------+
  • 문제 조건 2. 회원 이름, 리뷰 텍스트, 리뷰 작성일 조회합니다.
    • 리뷰 작성일 포맷: 'yyyy-mm-dd'
      • SELECT M.MEMBER_NAME, R.REVIEW_TEXT, TO_CHAR(R.REVIEW_DATE, 'yyyy-mm-dd'AS REVIEW_DATE
    • MEMBER_ID를 기준으로 JOIN 수행합니다.
      • FROM MEMBER_PROFILE M JOIN REST_REVIEW R ON M.MEMBER_ID = R.MEMBER_ID
  • 문제 조건 3. 리뷰 작성일을 기준으로 오름차순, 리뷰 텍스트를 기준으로 오름차순입니다.
    •   ORDER BY R.REVIEW_DATE, R.REVIEW_TEXT;
  • 문제 조건 1. 리뷰를 가장 많이 작성한 회원의 리뷰 조건입니다.
    •  WHERE M.MEMBER_ID =  : 회원의 리뷰를 봐야하기 때문에 MEMBER_ID를 기준으로 조건을 겁니다.
    •  (SELECT MEMBER_ID
         FROM (SELECT MEMBER_ID
                       FROM REST_REVIEW
                       GROUP BY MEMBER_ID
                       ORDER BY COUNT(MEMBER_ID) DESC)
         WHERE ROWNUM = 1)
      •  COUNT한 결과값 중 ROWNUM = 1로 제한을 두어야하기 때문에 서브쿼리를 사용합니다.
      • REST_REVIEW 테이블에서 MEMBER_ID를 그룹화하여, 각 MEMBER_ID에 속한 리뷰 수를 집계합니다.
      • 리뷰 수가 많은대로 순서대로 정렬합니다.
      • 그 중 가장 상위의 한 개의 MEMBER_ID만 선택합니다.

https://github.com/seonmin5/codingtest_Python
 

GitHub - seonmin5/codingtest_Python

Contribute to seonmin5/codingtest_Python development by creating an account on GitHub.

github.com

 

반응형