MySQL 8 버전부터는 rank 함수를 지원한다.
이전 버전에서는 계산하는 쿼리를 만들어야 하는데 몇가지 방법이 있는 것 같다.
1. COUNT 를 이용해서 만드는 방법
SELECT
ranking_no, ranking_score, ranking_name,
( SELECT COUNT(*) + 1 FROM ranking WHERE ranking_score > b.ranking_score ) AS rank
FROM
ranking_score AS b
ORDER BY
rank ASC
이 방식은 모든 로우 별로 Sub Query SELECT 문을 실행하기 때문에 많은 데이터가 존재할 경우 성능 저하 문제가 생긴다.
2. MySQL 의 사용자 정의 변수를 이용하여 만드는 방법
SELECT
ranking_no, ranking_score, ranking_name,
( @rank := @rank + 1 ) AS rank
FROM
ranking AS a,
( SELECT @rank := 0 ) AS b
ORDER BY
a.ranking_score DESC;
MySQL 에도 프로그램의 변수와 같은 개념으로 @변수명을 이용해 값을 유지할 수 있다.
다만 "@변수명" 은 모든 connect 에 유효한 값이 아니고, 해당 connect session 에서만 유효한 값이다.
8버전부터 지원하는 rank 함수를 살펴보자
- rank()
SELECT *, rank() over(order by Population desc) AS ranking
FROM city;
위 쿼리는 city 테이블에서 Population 내림차순으로 랭킹을 매겨라는 쿼리이다.

rank() 함수 실행 결과를 보면, Population 22000인 로우 2개의 ranking은 4021이고
다음 ranking은 4023으로 나오는걸 볼 수 있다.
- dense_rank()
SELECT *, dense_rank() over(order by Population desc) AS ranking
FROM city;

이와 다르게 dense_rank() 함수는 ranking 2530인 로우가 2개 이지만 다음 ranking을 살펴보면 2531로 나오는걸 볼 수 있다.