MySQLで列のN番目に高い値を取得する方法を徹底解説
MySQLで列のN番目に高い値を取得する基本構文
MySQLである列のN番目に高い値を取得したい場合、「ORDER BY DESC」と「LIMIT句」を組み合わせるのが最もシンプルで一般的な方法です。降順に並べ替えた結果に対して、LIMIT句でオフセットを指定することで、任意の順位のレコードを1件だけ取り出せます。
構文のポイント
LIMIT句は「LIMIT オフセット, 取得件数」の形式で指定します。N番目に高い値を取得するには、オフセットを「N - 1」に設定します。
例えば、ある列の2番目に高い値を取得したい場合は、以下のように記述します。
SELECT * FROM テーブル名 ORDER BY 列名 DESC LIMIT 1,1;
4番目に高い値を取得したい場合は、オフセットを3にします。
SELECT * FROM テーブル名 ORDER BY 列名 DESC LIMIT 3,1;
1番目(最高値)だけを取得する場合は、オフセット不要で次のように書けます。
SELECT * FROM テーブル名 ORDER BY 列名 DESC LIMIT 1;
このように、変更が必要なのはLIMIT句の部分だけで、あとは共通のパターンで対応できます。
動作確認用サンプルテーブルの作成
実際に構文を理解するために、従業員の給与データを格納するテーブルを作成してみましょう。以下のクエリでテーブルを作成します。
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:4番目に高い給与を取得する
「Salary」列の4番目に高い値を取得するクエリです。オフセットは「4 - 1 = 3」を指定します。
mysql> select *from NthSalaryDemo order by Salary desc limit 3,1;
実行結果:
+----+-------+--------+ | Id | Name | Salary | +----+-------+--------+ | 6 | David | 5400 | +----+-------+--------+ 1 row in set (0.00 sec)
降順に並べると 6000 → 5800 → 5700 → 5400 の順になるため、4番目の5400(Davidさん)が正しく取得できています。
ケース2:2番目に高い給与を取得する
「Salary」列の2番目に高い値を取得する場合は、オフセットに1を指定します。
mysql> select *from NthSalaryDemo order by Salary desc limit 1,1;
実行結果:
+----+------+--------+ | Id | Name | Salary | +----+------+--------+ | 3 | Mike | 5800 | +----+------+--------+ 1 row in set (0.00 sec)
最高値の6000(Samさん)の次に高い5800(Mikeさん)が返されました。
ケース3:最高値(1番目)を取得する
単純に最大値を取得するだけなら、LIMIT 1 を指定します。
mysql> select *from NthSalaryDemo order by Salary desc limit 1;
実行結果:
+----+------+--------+ | Id | Name | Salary | +----+------+--------+ | 2 | Sam | 6000 | +----+------+--------+ 1 row in set (0.00 sec)
ケース4:8番目に高い給与を取得する
8番目に高い値を取得する場合は、オフセットに「8 - 1 = 7」を指定します。
mysql> select *from NthSalaryDemo order by Salary desc limit 7,1;
実行結果:
+----+-------+--------+ | Id | Name | Salary | +----+-------+--------+ | 4 | Carol | 4500 | +----+-------+--------+ 1 row in set (0.00 sec)
まとめ
MySQLで列のN番目に高い値を取得するには、ORDER BY 列名 DESC で降順に並べ替え、LIMIT N-1, 1 の形式でオフセットを指定するのが基本です。この手法は面接や実務でよく問われる定番テクニックなので、ぜひ覚えておきましょう。なお、同率の値が存在する場合に重複を除外して順位を数えたいときは、DISTINCTやウィンドウ関数(DENSE_RANKなど)を併用する方法もあります。
-
MySQLで特定のカラム名を持つテーブルを検索する方法
MySQLで特定のカラム名(列名)を持つテーブルを探したい場合は、システムビューである information_schema.columns を利用します。このビューにはデータベース内のすべてのテーブルとカラムの情報が格納されているため、条件を指定して検索するだけで、目的のカラムを持つテーブルを簡単に特定できます。 基本構文 カラム名からテーブル名を検索する際の基本的な構文は以下の通りです。 select distinct table_name from information_schema.columns where column_name like %yourSearchValue% a
-
MySQLで列の最大値を取得する方法をわかりやすく解説
MySQLで特定の列の最大値を取得するには、MAX(columnName)関数を使用します。本記事では、その基本的な使い方に加えて、データベースやテーブルの設計に関する前提知識もあわせて解説します。MySQLのデータベースとテーブルの基礎MySQLをインストールする前に、まず使用するバージョンと配布形式(バイナリファイルか、ソースファイルからビルドするか)を決定することが重要です。新しく作成したばかりのデータベースには、当然ながらテーブルはまだ存在しません。データベース設計において最も重要なのは、以下の要素を決めることです。データベース全体の構造必要となるテーブルの一覧各テーブルに含まれる列(