Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 열의 n번째로 높은 값 찾는 방법 (ORDER BY + LIMIT 활용)

MySQL에서 열(column)의 n번째로 높은 값을 찾으려면 ORDER BY ... DESCLIMIT 절을 함께 사용하면 됩니다. 내림차순으로 정렬한 뒤 원하는 순번의 행 하나만 가져오는 방식입니다.

예를 들어 어떤 열에서 두 번째로 높은 값을 구하고 싶다면 아래와 같이 작성합니다.

SELECT * FROM yourTableName ORDER BY yourColumnName DESC LIMIT 1,1;

네 번째로 높은 값을 구하려면 다음과 같이 합니다.

SELECT * FROM yourTableName ORDER BY yourColumnName DESC LIMIT 3,1;

가장 높은 값(첫 번째 값)을 구하려면 다음과 같이 작성합니다.

SELECT * FROM yourTableName ORDER BY yourColumnName DESC LIMIT 1;

LIMIT 절의 동작 원리

위 구문에서 유일하게 바꿔야 하는 부분은 LIMIT 절입니다. LIMIT offset, count 형식에서 offset은 건너뛸 행의 개수, count는 가져올 행의 개수를 의미합니다. 따라서 n번째로 높은 값을 얻으려면 LIMIT n-1, 1처럼 지정하면 됩니다.

  • 두 번째 값 → LIMIT 1,1
  • 네 번째 값 → LIMIT 3,1
  • 첫 번째(최댓값) → LIMIT 1

예제 테이블 생성하기

구문을 이해하기 위해 실제 테이블을 만들어 보겠습니다. 테이블 생성 쿼리는 다음과 같습니다.

mysql> create table NthSalaryDemo
    -> (
    -> Id int NOT NULL AUTO_INCREMENT,
    -> Name varchar(10),
    -> Salary int,
    -> PRIMARY KEY(Id)
    -> );
Query OK, 0 rows affected (1.03 sec)

insert 명령을 사용해 테이블에 직원 이름과 급여 데이터를 입력합니다.

mysql> insert into NthSalaryDemo(Name,Salary) values('Larry',5700);
Query OK, 1 row affected (0.41 sec)
mysql> insert into NthSalaryDemo(Name,Salary) values('Sam',6000);
Query OK, 1 row affected (0.16 sec)
mysql> insert into NthSalaryDemo(Name,Salary) values('Mike',5800);
Query OK, 1 row affected (0.16 sec)
mysql> insert into NthSalaryDemo(Name,Salary) values('Carol',4500);
Query OK, 1 row affected (0.17 sec)
mysql> insert into NthSalaryDemo(Name,Salary) values('Bob',4900);
Query OK, 1 row affected (0.20 sec)
mysql> insert into NthSalaryDemo(Name,Salary) values('David',5400);
Query OK, 1 row affected (0.27 sec)
mysql> insert into NthSalaryDemo(Name,Salary) values('Maxwell',5300);
Query OK, 1 row affected (0.21 sec)
mysql> insert into NthSalaryDemo(Name,Salary) values('James',4000);
Query OK, 1 row affected (0.19 sec)
mysql> insert into NthSalaryDemo(Name,Salary) values('Robert',4600);
Query OK, 1 row affected (0.19 sec)

select 문으로 테이블의 전체 레코드를 조회해 보겠습니다.

mysql> select *from NthSalaryDemo;

실행 결과는 다음과 같습니다.

+----+---------+--------+
| Id | Name    | Salary |
+----+---------+--------+
|  1 | Larry   |   5700 |
|  2 | Sam     |   6000 |
|  3 | Mike    |   5800 |
|  4 | Carol   |   4500 |
|  5 | Bob     |   4900 |
|  6 | David   |   5400 |
|  7 | Maxwell |   5300 |
|  8 | James   |   4000 |
|  9 | Robert  |   4600 |
+----+---------+--------+
9 rows in set (0.00 sec)

사례별 쿼리 실행 결과

사례 1: 네 번째로 높은 급여 구하기

아래 쿼리는 'Salary' 열에서 네 번째로 높은 값을 반환합니다.

mysql> select *from NthSalaryDemo order by Salary desc limit 3,1;

실행 결과:

+----+-------+--------+
| Id | Name  | Salary |
+----+-------+--------+
|  6 | David | 5400   |
+----+-------+--------+
1 row in set (0.00 sec)

사례 2: 두 번째로 높은 급여 구하기

'Salary' 열에서 두 번째로 높은 값을 얻는 쿼리입니다.

mysql> select *from NthSalaryDemo order by Salary desc limit 1,1;

실행 결과:

+----+------+--------+
| Id | Name | Salary |
+----+------+--------+
|  3 | Mike | 5800   |
+----+------+--------+
1 row in set (0.00 sec)

사례 3: 가장 높은 급여(최댓값) 구하기

열에서 가장 높은 값을 얻는 쿼리입니다.

mysql> select *from NthSalaryDemo order by Salary desc limit 1;

실행 결과:

+----+------+--------+
| Id | Name | Salary |
+----+------+--------+
|  2 | Sam  | 6000   |
+----+------+--------+
1 row in set (0.00 sec)

사례 4: 여덟 번째로 높은 급여 구하기

'Salary' 열에서 여덟 번째로 높은 값을 얻고 싶다면 아래 쿼리를 사용합니다.

mysql> select *from NthSalaryDemo order by Salary desc limit 7,1;

실행 결과:

+----+-------+--------+
| Id | Name  | Salary |
+----+-------+--------+
|  4 | Carol |   4500 |
+----+-------+--------+
1 row in set (0.00 sec)

이처럼 ORDER BY DESC로 정렬한 후 LIMIT 절의 offset 값만 조정하면, 열의 원하는 순번(n번째)에 해당하는 값을 손쉽게 조회할 수 있습니다.