sql >> データベース >  >> RDS >> Sqlserver

SQL ServerでのCOUNT()のしくみ

    SQL Serverでは、 COUNT() 関数は、グループ内で見つかったアイテムの数を返します。これを使用して、テーブルまたは結果セットに含まれる行数を確認できます。

    構文

    構文は次のようになります:

    -- Aggregation Function Syntax  
    COUNT ( { [ [ ALL | DISTINCT ] expression ] | * } )  
    
    -- Analytic Function Syntax  
    COUNT ( [ ALL ]  { expression | * } ) OVER ( [  ] )
    
    >

    ALL 集計関数をすべての値に適用します。これがデフォルト値です。

    DISTINCT 関数が一意のnull以外の値の数を返すことを指定します。

    画像を除くすべてのタイプの式です 、 ntext 、またはテキスト 。集計関数とサブクエリは、式ではサポートされていません。

    * 重複する行、およびnull値を含む行を含め、すべての行をカウントして返す必要があることを指定します。 COUNT(*) パラメータを受け取らず、 DISTINCTの使用をサポートしていません 。また、も必要ありません パラメータ(特定の列に関する情報を使用しないため)。

    OVER([] FROMによって生成された結果セットを分割します 関数が適用されるパーティションへの句。指定しない場合、関数はクエリ結果セットのすべての行を単一のグループとして扱います。

    例1-基本的な使用法

    この関数がどのように機能するかを示す基本的な例を次に示します。

    SELECT COUNT(*) AS 'Row Count'
    FROM Artists;
    

    結果:

    +-------------+
    | Row Count   |
    |-------------|
    | 16          |
    +-------------+
    

    この場合、 Artists には16行あります。 テーブル。

    念のために言っておきますが、ここにあります:

    SELECT *
    FROM Artists;
    

    結果:

    +------------+------------------------+--------------+-------------+
    | ArtistId   | ArtistName             | ActiveFrom   | CountryId   |
    |------------+------------------------+--------------+-------------|
    | 1          | Iron Maiden            | 1975-12-25   | NULL        |
    | 2          | AC/DC                  | 1973-01-11   | NULL        |
    | 3          | Allan Holdsworth       | 1969-01-01   | NULL        |
    | 4          | Buddy Rich             | 1919-01-01   | NULL        |
    | 5          | Devin Townsend         | 1993-01-01   | NULL        |
    | 6          | Jim Reeves             | 1948-01-01   | NULL        |
    | 7          | Tom Jones              | 1963-01-01   | NULL        |
    | 8          | Maroon 5               | 1994-01-01   | NULL        |
    | 9          | The Script             | 2001-01-01   | NULL        |
    | 10         | Lit                    | 1988-06-26   | NULL        |
    | 11         | Black Sabbath          | 1968-01-01   | NULL        |
    | 12         | Michael Learns to Rock | 1988-03-15   | NULL        |
    | 13         | Carabao                | 1981-01-01   | NULL        |
    | 14         | Karnivool              | 1997-01-01   | NULL        |
    | 15         | Birds of Tokyo         | 2004-01-01   | NULL        |
    | 16         | Bodyjar                | 1990-01-01   | NULL        |
    +------------+------------------------+--------------+-------------+
    

    予想どおり、16行が返されます。

    CountryId に注意してください 列にはnull値しか含まれていません。これは次の例で役立ちます。

    例2–列を指定する

    前の例では、アスタリスク( * )を使用しました )すべての行を指定します。これにより、重複があるかどうか、またはnull値が含まれているかどうかに関係なく、すべての行がカウントされます。

    特定の列を指定することもできます。これを行うと、null値はカウントされません。つまり、その列にnull値を含む行はカウントされません。

    CountryId を使用した例を次に示します。 前の例で述べた列:

    SELECT COUNT(CountryId) AS 'Row Count'
    FROM Artists;
    

    結果:

    +-------------+
    | Row Count   |
    |-------------|
    | 0           |
    +-------------+
    

    前の例で見たように、この列のすべての行は NULLです。 。したがって、結果の行数はゼロになります。

    その列にいくつかの値を追加しましょう:

    UPDATE Artists
    SET CountryId = 2
    WHERE ArtistName IN (
        'AC/DC', 
        'Karnivool', 
        'Birds of Tokyo', 
        'Bodyjar'
        );
    

    次に、その列の行をもう一度数えましょう:

    SELECT COUNT(CountryId) AS 'Row Count'
    FROM Artists;
    

    結果:

    +-------------+
    | Row Count   |
    |-------------|
    | 4           |
    +-------------+
    

    例3–DISTINCTを使用

    この例では、 DISTINCTを使用しています 個別の行のみを返す句(つまり、重複しない行)。

    前の例では、同じ CountryId になるようにテーブルを更新しました 4人のアーティストに適用されました( SET CountryId =2を使用しました 4人のアーティスト全員)。これにより、同じ CountryId の4つの行が作成されました。 。

    個別の CountryId の数を数えるとどうなりますか sはそのテーブルにあります:

    SELECT COUNT(DISTINCT CountryId) 'Distinct CountryIds'
    FROM Artists;
    

    結果:

    +-----------------------+
    | Distinct CountryIds   |
    |-----------------------|
    | 1                     |
    +-----------------------+
    

    CountryId の行は4つありますが、これは予想されることです。 、それでも1つの異なる CountryId

    念のため、「明確でない」バージョンと一緒に実行してみましょう。

    SELECT 
      COUNT(CountryId) 'Non Distinct',
      COUNT(DISTINCT CountryId) 'Distinct'
    FROM Artists;
    

    結果:

    +----------------+------------+
    | Non Distinct   | Distinct   |
    |----------------+------------|
    | 4              | 1          |
    +----------------+------------+
    

    したがって、明確でないバージョンは、 CountryId の回数を示します DISTINCT がテーブルに表示されますが、 versionは、複数回の出現を1としてカウントします。

    別の CountryId を追加しましょう テーブルへ:

    UPDATE Artists
    SET CountryId = 1
    WHERE ArtistName = 'Carabao';
    

    そして、クエリを再度実行します:

    SELECT 
      COUNT(CountryId) 'Non Distinct',
      COUNT(DISTINCT CountryId) 'Distinct'
    FROM Artists;
    

    結果:

    +----------------+------------+
    | Non Distinct   | Distinct   |
    |----------------+------------|
    | 5              | 2          |
    +----------------+------------+
    

    例4–WHERE句を使用する

    WHEREを使用した簡単な例を次に示します。 条項。

    SELECT COUNT(*) AS 'Row Count'
    FROM Artists
    WHERE ActiveFrom >= '2000-01-01';
    

    結果:

    +-------------+
    | Row Count   |
    |-------------|
    | 2           |
    +-------------+
    

    例5–GROUPBYを使用

    これは、1つの列でアーティストをグループ化し、もう1つの列で各アーティストのすべてのアルバムをカウントする例です。

    例:

    SELECT 
      ArtistName,
      COUNT(al.AlbumId) 'Number of Albums'
    FROM Artists ar
    INNER JOIN Albums al
    ON al.ArtistId = ar.ArtistId
    GROUP BY ArtistName
    ORDER BY 'Number of Albums' DESC;
    

    結果:

    +------------------------+--------------------+
    | ArtistName             | Number of Albums   |
    |------------------------+--------------------|
    | Iron Maiden            | 5                  |
    | Michael Learns to Rock | 3                  |
    | The Script             | 3                  |
    | Tom Jones              | 3                  |
    | Devin Townsend         | 3                  |
    | Allan Holdsworth       | 2                  |
    | Buddy Rich             | 1                  |
    | AC/DC                  | 1                  |
    | Jim Reeves             | 1                  |
    +------------------------+--------------------+
    

    例6–HAVING句を使用

    前の例を微調整して、特定の数を超えるアルバムを持っているアーティストのみを含めることができます。 HAVINGを使用してこれを行うことができます 条項。

    SELECT 
      ArtistName,
      COUNT(al.AlbumId) 'Number of Albums'
    FROM Artists ar
    INNER JOIN Albums al
    ON al.ArtistId = ar.ArtistId
    GROUP BY ArtistName
    HAVING COUNT(al.AlbumId) > 2
    ORDER BY 'Number of Albums' DESC;
    

    結果:

    +------------------------+--------------------+
    | ArtistName             | Number of Albums   |
    |------------------------+--------------------|
    | Iron Maiden            | 5                  |
    | Michael Learns to Rock | 3                  |
    | The Script             | 3                  |
    | Tom Jones              | 3                  |
    | Devin Townsend         | 3                  |
    +------------------------+--------------------+
    

    例7–OVER句を使用したパーティション分割

    OVERを使用できます PARTITION BYを含む句 結果をパーティションに分割します。

    この例では、 OVER(PARTITION BY ArtistName)を使用します アーティストが制作した各アルバムと、そのアーティストのアルバムの総数を一覧表示します。

    SELECT  
      ArtistName,
      AlbumName,
      COUNT(AlbumId) OVER (PARTITION BY ArtistName) 'Number of Albums from this Artist'
    FROM Artists ar
    INNER JOIN Albums al
    ON al.ArtistId = ar.ArtistId
    ORDER BY 'Number of Albums from this Artist' DESC;
    

    結果:

    +------------------------+--------------------------+-------------------------------------+
    | ArtistName             | AlbumName                | Number of Albums from this Artist   |
    |------------------------+--------------------------+-------------------------------------|
    | Iron Maiden            | Powerslave               | 5                                   |
    | Iron Maiden            | Somewhere in Time        | 5                                   |
    | Iron Maiden            | Piece of Mind            | 5                                   |
    | Iron Maiden            | Killers                  | 5                                   |
    | Iron Maiden            | No Prayer for the Dying  | 5                                   |
    | AC/DC                  | Powerage                 | 3                                   |
    | AC/DC                  | Back in Black            | 3                                   |
    | AC/DC                  | Rock or Bust             | 3                                   |
    | Michael Learns to Rock | Blue Night               | 3                                   |
    | Michael Learns to Rock | Eternity                 | 3                                   |
    | Michael Learns to Rock | Scandinavia              | 3                                   |
    | Devin Townsend         | Ziltoid the Omniscient   | 3                                   |
    | Devin Townsend         | Casualties of Cool       | 3                                   |
    | Devin Townsend         | Epicloud                 | 3                                   |
    | Tom Jones              | Long Lost Suitcase       | 3                                   |
    | Tom Jones              | Praise and Blame         | 3                                   |
    | Tom Jones              | Along Came Jones         | 3                                   |
    | Allan Holdsworth       | All Night Wrong          | 2                                   |
    | Allan Holdsworth       | The Sixteen Men of Tain  | 2                                   |
    | Buddy Rich             | Big Swing Face           | 1                                   |
    | Jim Reeves             | Singing Down the Lane    | 1                                   |
    | The Script             | No Sound Without Silence | 1                                   |
    +------------------------+--------------------------+-------------------------------------+
    

    これにより、アーティストとアルバムの数が複数の行で繰り返されることに注意してください。ただし、各アルバムをそれぞれの行にリストする場合にも、これが予想されます。

    例8– STRING_AGG()を使用

    前の例のように、各アーティストとアルバムの数を複数の行に繰り返したくない場合は、いつでも STRING_AGG()を使用できます。 アルバムをリストとして出力する機能。この場合、 OVERは必要ありません。 条項。

    例:

    SELECT
      ArtistName,
      STRING_AGG(AlbumName, ', ') 'Albums',
      COUNT(AlbumId) 'Count'
    FROM Artists ar
    INNER JOIN Albums al
    ON al.ArtistId = ar.ArtistId
    GROUP BY ArtistName
    ORDER BY 'Count' DESC;
    

    結果:

    +------------------------+--------------------------------------------------------------------------------+---------+
    | ArtistName             | Albums                                                                         | Count   |
    |------------------------+--------------------------------------------------------------------------------+---------|
    | Iron Maiden            | Powerslave, Somewhere in Time, Piece of Mind, Killers, No Prayer for the Dying | 5       |
    | AC/DC                  | Powerage, Back in Black, Rock or Bust                                          | 3       |
    | Michael Learns to Rock | Blue Night, Eternity, Scandinavia                                              | 3       |
    | Devin Townsend         | Ziltoid the Omniscient, Casualties of Cool, Epicloud                           | 3       |
    | Tom Jones              | Long Lost Suitcase, Praise and Blame, Along Came Jones                         | 3       |
    | Allan Holdsworth       | All Night Wrong, The Sixteen Men of Tain                                       | 2       |
    | Buddy Rich             | Big Swing Face                                                                 | 1       |
    | Jim Reeves             | Singing Down the Lane                                                          | 1       |
    | The Script             | No Sound Without Silence                                                       | 1       |
    +------------------------+--------------------------------------------------------------------------------+---------+
    

    たくさんの行?

    COUNT() 関数はその結果をintとして返します データ・タイプ。行が多すぎて結果がintよりも大きい場合 処理できます。COUNT_BIG()を試してください 代わりに。

    COUNT_BIG() COUNT()と同じように機能します 、結果が bigintとして返されることを除いて データ型の値。

    APPROX_COUNT_DISTINCT()の使用を検討することもできます ある場合には。

    APPROX_COUNT_DISTINCT() 正確な値ではなく、おおよその値を返します。ただし、 COUNT()よりもはるかに応答性が高くなるように設計されています およびCOUNT_BIG() 、したがって、応答性が精度よりも重要である場合に役立つ可能性があります。

    null以外の一意の値を返すように設計されているため、通常は DISTINCTを使用する場合にのみ関連します。 COUNT_BIG()を含む句 。

    また、これを書いている時点では、 APPROX_COUNT_DISTINCT() パブリックプレビューステータスです。


    1. ClusterControl 1.7.5の発表:PostgreSQL12およびMongoDB4.2の高度なクラスターメンテナンスとサポート

    2. OracleSQLを使用して区切り文字の位置で文字列を分割する

    3. ODBCとは何ですか?

    4. SQL SUBSTRING()関数を使用してプロのように文字列を解析する方法は?