SQLを使用して、特定の列で最大値を持つ行を検索して選択する3つの例を次に示します。
これらの例は、MySQL、MariaDB、PostgreSQL、SQLite、Oracle、SQLServerなどのほとんどの主要なRDBMSで機能します。
次のデータから始めます:
SELECT * FROM PetShow;
結果:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 2 | Scratch | 3 | | 3 | Tweet | 65 | | 4 | Bark | 8 | | 5 | Ruff | 15 | | 6 | Woof | 20 | | 7 | Punch | 3 | +---------+-----------+---------+
Score
から最大値の行を選択する例を次に示します。 上記の表の列:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow );
結果:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
MAX()
を使用しました サブクエリ内で関数を使用して最大値を検索し、外部クエリで行全体を返しました。
このメソッドを使用すると、最大値を持つ行が複数ある場合、それらすべてが返されます。
既存の最大スコアと同じスコアを持つ別の行をテーブルに挿入するとします。
INSERT INTO PetShow VALUES (8, 'Purr', 85);
SELECT * FROM PetShow;
テーブルは次のようになります:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 2 | Scratch | 3 | | 3 | Tweet | 65 | | 4 | Bark | 8 | | 5 | Ruff | 15 | | 6 | Woof | 20 | | 7 | Punch | 3 | | 8 | Purr | 85 | +---------+-----------+---------+
WagとPurrの両方が85の最高スコアを獲得していることがわかります。
前のクエリをもう一度実行して、その列から最大値を返しましょう:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow );
結果:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 8 | Purr | 85 | +---------+-----------+---------+
最大値の両方の行が期待どおりに返されます。
必要に応じて、結果セットを1行に制限できます。正確なコードは、使用されているRDBMSによって異なります。
LIMIT
句は、PostgreSQL、MariaDB、MySQL、SQLiteなどのRDBSで使用できます:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow )
ORDER BY PetId ASC
LIMIT 1;
結果:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 1 | Wag | 85 | +-------+---------+-------+
SQL Serverでは、TOP
を使用できます 条項:
SELECT TOP 1
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow )
ORDER BY PetId ASC;
結果:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 1 | Wag | 85 | +-------+---------+-------+
そしてOracleデータベースの場合:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow )
ORDER BY PetId ASC
FETCH FIRST 1 ROW ONLY;
結果:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 1 | Wag | 85 | +-------+---------+-------+
1行だけを返したい場合は、実際には他のほとんどのコードを削除して、順序付けられた結果から最初の行を取得することができます。
SELECT
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score DESC
LIMIT 1;
結果:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
SQL Serverの場合:
SELECT TOP 1
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score DESC;
結果:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
そしてOracleデータベースの場合:
SELECT
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score DESC
FETCH FIRST 1 ROW ONLY;
結果:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
最大値の行を選択する別の方法は、次のようにテーブル自体を結合することです。
SELECT
p1.PetId,
p1.PetName,
p1.Score
FROM PetShow p1
LEFT JOIN PetShow p2 ON p1.Score < p2.Score
WHERE p2.PetId IS NULL;
結果:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 8 | Purr | 85 | +---------+-----------+---------+
前の例と同様に、必要に応じて結果を1行(または他の数)に制限できます。