Skip to main content

[SQL] MySQL과 ORACLE에서 상위 3개의 데이터만 조회하는 방법


MySQL

1. MySQL

MySQL에서는 상위 N개 행만 조회할 때 LIMIT 절을 사용한다.
예를 들어, 가장 많이 팔린 아이스크림 상위 3개 맛(FLAVOR) 를 조회하려면 SQL 쿼리의 마지막에 아래처럼 붙이면 된다.

LIMIT 3;

아래와 같이 ORDER BY 정렬 후에 붙인다.

ORDER BY 
    TOTAL_ORDER_SUM DESC
LIMIT 3;

만약 필요하다면 LIMIT 0, 3 형태로 써도 된다. (페이지네이션용)

  • 예: LIMIT 0, 30번째부터 3개라는 뜻이다.

MySQL에서는 LIMIT NLIMIT M, N 두 가지 형태 모두 지원한다.
두 문법의 차이는 시작 위치와 개수를 조절할 수 있느냐에 있다.


1.1 LIMIT N

  • 앞에서부터 N개를 가져온다.
  • 예: LIMIT 3처음부터 3개
SELECT FLAVOR
FROM FIRST_HALF
ORDER BY TOTAL_ORDER DESC
LIMIT 3;

1.2 LIMIT M, N

  • M번째 행부터 시작해서 N개를 가져온다.
  • 예: LIMIT 0, 30번째(첫 번째)부터 3개
  • 예: LIMIT 3, 54번째부터 5개
SELECT FLAVOR
FROM FIRST_HALF
ORDER BY TOTAL_ORDER DESC
LIMIT 0, 3;  -- 0번째부터 3개 출력 (즉, 처음 3개)

1.3 차이

구문

의미

LIMIT 3

처음부터 3개

LIMIT 0, 3

0번째부터 3개 (시작 위치 + 개수)

LIMIT 3, 5

3번째부터 5개


Oracle

2. Oracle

2.1 FETCH FIRST 3 ROWS ONLY (Oracle 12c 이상)

SELECT 
    F.FLAVOR,
    F.TOTAL_ORDER + NVL(J.JULY_TOTAL, 0) AS TOTAL_ORDER_SUM
FROM 
    FIRST_HALF F
LEFT JOIN (
    SELECT 
        FLAVOR, 
        SUM(TOTAL_ORDER) AS JULY_TOTAL
    FROM JULY
    GROUP BY FLAVOR
) J ON F.FLAVOR = J.FLAVOR
ORDER BY 
    TOTAL_ORDER_SUM DESC
FETCH FIRST 3 ROWS ONLY;

🔸 NVL()은 Oracle에서 IFNULL()과 같은 역할


2.2 ROWNUM 사용 (Oracle 11g 이하 또는 호환성 유지용)

SELECT *
FROM (
    SELECT 
        F.FLAVOR,
        F.TOTAL_ORDER + NVL(J.JULY_TOTAL, 0) AS TOTAL_ORDER_SUM
    FROM 
        FIRST_HALF F
    LEFT JOIN (
        SELECT 
            FLAVOR, 
            SUM(TOTAL_ORDER) AS JULY_TOTAL
        FROM JULY
        GROUP BY FLAVOR
    ) J ON F.FLAVOR = J.FLAVOR
    ORDER BY TOTAL_ORDER_SUM DESC
)
WHERE ROWNUM <= 3;

🔸 ROWNUM은 정렬 전에 먼저 부여되므로 반드시 서브쿼리로 정렬을 먼저 해야 정확하게 상위 3개를 가져올 수 있다.

필요한 Oracle 버전이나 형식에 맞게 둘 중 하나 선택해서 사용하면 된다.
버전이 12c 이상이라면 첫 번째 방식(FETCH FIRST 3 ROWS ONLY)이 더 깔끔하고 표준 SQL에 가깝다.