안녕하세요.
오늘은 SQL을 활용하여 유형별 상위 n개 데이터를 조회하는 방법에 대해 소개해드리겠습니다.
※ 순위와는 다른 유형으로 순위에 대한 포스팅은 아래의 글을 참조하시면 됩니다.
- 2021.07.10 - [Programming & Data Analysis/SQL] - [MySQL] rank 순위 구하기
- 2020.08.25 - [Programming & Data Analysis/SQL] - [MySQL] 그룹별 순위 매기기 구현하기
RDBMS별 문법 차이
RDBMS | Function |
MS-SQL | Top N, Top N with ties |
ORACLE | where rownum < N+1 |
MySQL | LIMIT N |
▣ 예시 데이터 : Customers
1. MS-SQL
SQL Server 또는 MS-SQL에서는 주로 Top을 사용한다.
# 상위 3개의 행을 추출
select top 3 * from customers order by customerID
# 상위 3개의 행 추출하되, 동일한 데이터 존재할 경우 함께 출력
select top 3 with ties * from customers order by customerID
with ties는 동일한 데이터도 출력할 때 사용하고 이 때 order by는 반드시 써줘야 작동함.
2. Oracle
Oracle은 따로 함수는 없고 데이터베이스에 참조되는 의사 컬럼 rownum을 활용한다.
select rownum, * from (select * from customers order by customerID) A
where rownum < 4;
여기서 주의할 점은 order by를 사용할 때, 서브쿼리 없이 그냥 붙여버리면 오라클 실행 순서상 order by문이 먼저 실행되어 rownum 순서대로 나오지 않고 뒤죽박죽 섞여서 나오므로 order by문을 사용하고 싶다면 위의 예시처럼 서브쿼리로 묶어서 사용해야 한다.
또한, 실제 데이터베이스에 저장된 데이터 값이 아니라 다룰 때 주의해야 되는 부분이 많으므로 이에 대해 자세히 알고 싶다면 다음의 게시글을 참조하시기를 바랍니다.
- 오라클 ROWNUM 개념부터 활용까지 [Wakestand Island]
3. MySQL
MySQL은 LIMIT을 사용한다.
( 개인적으로 MySQL의 LIMIT이 가장 편리하게 사용 가능함 )
# 상위 3개 가져오기
SELECT * FROM Customers order by customerID LIMIT 3;
# LIMIT 시작점, 갯수 (아래 예의 경우 4번째부터 6개 추출. 첫번째 파라미터는 0 부터 시작함!)
SELECT * FROM Customers order by customerID LIMIT 3, 6;
Limit은 Top의 간단함과 Rownum의 범위 기능을 모두 가진 간편한 함수입니다.
Top처럼 간단하게 뒤에 뽑고 싶은 데이터 개수를 적어주면 되고 ROWNUM BETWEEN ~ AND ~처럼 뽑고 싶은 범위의 개수도 적을 수 있어 사용하기 간단합니다.
주의할 점은 범위를 사용할 때는 인덱스 순서가 0부터 시작임을 유의하시기를 바랍니다.
▣ 동일한 결과 도출
'Programming > SQL' 카테고리의 다른 글
[MySQL] 문자열 자르기 (SUBSTR, SUBSTRING) (0) | 2021.08.22 |
---|---|
[MySQL] EXISTS와 IN 사용법 비교하기 (예제) (0) | 2021.08.05 |
[SQL] null 처리하기 (조회, 대체) (0) | 2021.07.29 |
[MySQL] 서브쿼리 설명 및 예제 (0) | 2021.07.28 |
[MySQL] rank 순위 구하기 (0) | 2021.07.10 |
댓글