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 | +---------+-----------+---------+
上記の表から最小値の行を選択するための最初のオプションは次のとおりです。
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MIN(Score) FROM PetShow );
結果:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | +---------+-----------+---------+
ここでは、MIN()
を使用しました サブクエリ内で関数を使用して最小値を検索し、外部クエリで行全体を返しました。
このメソッドを使用すると、最小値の行が複数ある場合、それらすべてが返されます。
既存の最小スコアと同じスコアを持つ別の行をテーブルに挿入するとします。
INSERT INTO PetShow VALUES (7, 'Punch', 3);
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 | +---------+-----------+---------+
ScratchとPunchの両方が3という低いスコアを持っていることがわかります。
前のクエリをもう一度実行して、その列から最小値を返しましょう:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MIN(Score) FROM PetShow );
結果:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | | 7 | Punch | 3 | +---------+-----------+---------+
最小値の両方の行が返されます。
必要に応じて、結果セットを1行に制限できます。正確なコードは、使用されているRDBMSによって異なります。
LIMIT
句は、PostgreSQL、MariaDB、MySQL、SQLiteなどのRDBSで使用できます:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MIN(Score) FROM PetShow )
ORDER BY PetId ASC
LIMIT 1;
結果:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 2 | Scratch | 3 | +-------+---------+-------+
SQL Serverでは、TOP
を使用できます 条項:
SELECT TOP 1
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MIN(Score) FROM PetShow )
ORDER BY PetId ASC;
結果:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | +---------+-----------+---------+
そして、Oracle Databaseでは、これを行うことができます:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MIN(Score) FROM PetShow )
ORDER BY PetId ASC
FETCH FIRST 1 ROW ONLY;
結果:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | +---------+-----------+---------+
1行だけを返したい場合は、実際には他のほとんどのコードを削除して、順序付けられた結果から最初の行を取得することができます。
SELECT
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score ASC
LIMIT 1;
結果:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 7 | Punch | 3 | +-------+---------+-------+
SQL Serverの場合:
SELECT TOP 1
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score ASC;
結果:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | +---------+-----------+---------+
そしてOracleデータベースの場合:
SELECT
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score ASC
FETCH FIRST 1 ROW ONLY;
結果:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | +---------+-----------+---------+
最小値の行を選択する別の方法は、次のようにテーブル自体を結合することです。
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行(または他の数)に制限できます。