[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, 3
은 0번째부터 3개라는 뜻이다.
MySQL에서는 LIMIT N
과 LIMIT 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, 3
→ 0번째(첫 번째)부터 3개 - 예:
LIMIT 3, 5
→ 4번째부터 5개
SELECT FLAVOR
FROM FIRST_HALF
ORDER BY TOTAL_ORDER DESC
LIMIT 0, 3; -- 0번째부터 3개 출력 (즉, 처음 3개)
1.3 차이
구문 | 의미 |
---|---|
| 처음부터 3개 |
| 0번째부터 3개 (시작 위치 + 개수) |
| 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에 가깝다.