특정 열에서 가장 높은 값 세 개를 선택한 뒤, 해당되는 이름(Name) 열을 알파벳순으로 정렬하려면 ORDER BY 절과 서브쿼리를 활용하면 됩니다. 먼저 예제용 테이블을 생성해 보겠습니다.
mysql> create table DemoTable
(
Name varchar(40),
Score int
);
Query OK, 0 rows affected (1.11 sec)INSERT 명령을 사용해 테이블에 샘플 데이터를 삽입합니다.
mysql> insert into DemoTable values('Chris',45);
Query OK, 1 row affected (0.26 sec)
mysql> insert into DemoTable values('Bob',98);
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values('David',78);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable values('Mike',96);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values('Carol',43);
Query OK, 1 row affected (0.20 sec)SELECT 문으로 테이블의 전체 레코드를 확인합니다.
mysql> select *from DemoTable;
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
+-------+-------+ | Name | Score | +-------+-------+ | Chris | 45 | | Bob | 98 | | David | 78 | | Mike | 96 | | Carol | 43 | +-------+-------+ 5 rows in set (0.00 sec)
점수 상위 3개를 조회하고 이름순으로 정렬하는 쿼리
"Score" 열에서 가장 높은 값 세 개를 선택한 후, 해당되는 "Name" 열을 알파벳순으로 정렬하는 쿼리는 다음과 같습니다.
mysql> select *from (select Name,Score from DemoTable order by Score desc,Name asc limit 3) tbl order by Name;
실행 결과는 아래와 같습니다.
+-------+-------+ | Name | Score | +-------+-------+ | Bob | 98 | | David | 78 | | Mike | 96 | +-------+-------+ 3 rows in set (0.03 sec)
쿼리 동작 원리
이 쿼리는 두 단계로 동작합니다. 먼저 내부 서브쿼리에서 ORDER BY Score DESC로 점수를 내림차순 정렬한 뒤 LIMIT 3을 사용해 상위 3개 행만 추출합니다. 이때 점수가 동일한 경우를 대비해 Name ASC 조건도 함께 지정했습니다. 이후 외부 쿼리에서 추출된 결과를 ORDER BY Name으로 이름 기준 오름차순(알파벳순) 정렬하여 최종 결과를 반환합니다. 이처럼 서브쿼리와 LIMIT을 조합하면 상위 N개 데이터를 원하는 순서대로 손쉽게 조회할 수 있습니다.