MySQLでテーブルから2番目に高い給与を取得する方法(LIMITとOFFSETの使い方)
MySQLのテーブルから「2番目に高い給与」を取得したい場面は、実務でも面接でもよく登場する定番の課題です。この記事では、LIMIT句とOFFSET句を組み合わせたシンプルな方法を、実際のサンプルデータを使いながらわかりやすく解説します。
サンプルデータの準備
まず、以下のような従業員名と給与を格納したテーブル Salary を用意します。
mysql> Select * from Salary; +--------+--------+ | Name | Salary | +--------+--------+ | Gaurav | 50000 | | Rahul | 40000 | | Ram | 45000 | | Raman | 45000 | +--------+--------+ 4 rows in set (0.00 sec)
このデータを見ると、最高額は Gaurav の 50000、その次に高いのは 45000 であることがわかります。ここから2番目に高い給与を持つ行を取得してみましょう。
LIMIT と OFFSET を使った取得方法
2番目に高い給与を取得するには、給与を降順(DESC)に並べ替えたうえで、先頭の1件をスキップし、次の1件だけを取り出します。これを実現するのが ORDER BY・LIMIT・OFFSET の組み合わせです。
mysql> Select * from Salary order by Salary DESC limit 1 offset 1; +-------+--------+ | Name | Salary | +-------+--------+ | Raman | 45000 | +-------+--------+ 1 row in set (0.00 sec)
クエリの仕組み
- ORDER BY Salary DESC: 給与を高い順に並べ替えます。
- LIMIT 1: 取得する行数を1件に制限します。
- OFFSET 1: 先頭の1件(最高額)をスキップします。
つまり「降順に並べたリストの2番目」を取り出すことで、2番目に高い給与の行が得られるという仕組みです。同様に OFFSET 2 に変更すれば、3番目に高い給与も取得できます。
注意点:同額のデータがある場合
上記の例では、45000 という同じ給与が2人分存在します。この方法では並べ替え後の「行の位置」に基づいて取得するため、同額のデータがあっても単純に2行目を返します。もし「重複を除いた上で2番目に高い金額」が必要な場合は、DISTINCT を組み合わせると確実です。
mysql> Select DISTINCT Salary from Salary order by Salary DESC limit 1 offset 1; +--------+ | Salary | +--------+ | 45000 | +--------+ 1 row in set (0.00 sec)
まとめ
MySQLでN番目に高い値を取得する基本は、「ORDER BY で降順に並べ、LIMIT 1 と OFFSET (N-1) で位置を指定する」ことです。シンプルでありながら応用範囲が広いテクニックなので、ぜひ覚えておきましょう。
-
MySQLで特定の月と年のレコードを抽出する方法(YEAR()・MONTH()関数の使い方)
はじめにMySQLで特定の月と年に該当するレコードだけを取り出したい場合は、YEAR() 関数と MONTH() 関数を組み合わせて使用します。これらの関数は、日付型のカラムからそれぞれ「年」と「月」を数値として抽出できるため、WHERE句での条件指定に非常に便利です。本記事では、実際にテーブルを作成し、データを挿入してから、特定の年月のレコードを抽出するまでの手順を順番に解説します。1. サンプルテーブルの作成まず、顧客の購入情報を管理するテーブルを作成します。顧客ID、顧客名、請求額、購入日を持つシンプルな構造です。mysql> create table DemoTable
-
MySQLテーブルから新しく追加されたレコードを取得する方法
MySQLでテーブルに新しく追加されたレコードを取得するには、ORDER BY句とLIMIT句を組み合わせて使用します。AUTO_INCREMENTで採番される主キー(ID)を基準に降順(DESC)で並べ替え、LIMITで取得件数を指定することで、最新のレコードだけを効率的に取り出せます。 サンプルテーブルの作成 まず、CREATE TABLE文でテーブルを作成します。ここでは、自動採番される「StudentId」を主キーとする学生テーブルを用意しました。 mysql> create table DemoTable1486 -> ( -> StudentId