sql >> データベース >  >> NoSQL >> MongoDB

SQLで最小値の行を選択する3つの方法

    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      |
    +---------+-----------+---------+
    オプション1

    上記の表から最小値の行を選択するための最初のオプションは次のとおりです。

    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       |
    +---------+-----------+---------+
    オプション2

    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       |
    +---------+-----------+---------+
    オプション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行(または他の数)に制限できます。


    1. Node.js-複数の非同期呼び出しを待つ

    2. AzureワーカーロールとOWINを使用してSignalRをスケーリングする方法

    3. マングースがネストされたオブジェクトを保存しない

    4. Redisクライアント