Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

COUNT

テーブルや特定の列から、行の数を返す集約関数です。

Synopsis

COUNT(*)

COUNT([ALL | DISTINCT [BY(col-list)]] expression [%FOREACH(col-list)] [%AFTERHAVING])

引数

* 指定のテーブル内の行の合計を返すために、すべての行をカウントすることを指定。COUNT(*) は他の引数を取らず、ALL キーワードや DISTINCT キーワードとは併用できません。COUNT(*) は、expression 引数を取らず、どの特定列に関する情報も使用しません。COUNT(*) は、重複を除外せずに指定されたテーブルやビューの行数を返します。それぞれの行は、NULL 値を持つ行も含めて、個別にカウントされます。
ALL オプションCOUNT が expression にあるすべての値の個数を返すように指定します。キーワードが指定されていない場合は、これが既定になります。
DISTINCT オプション — COUNTexpression の個別 (一意) の値の個数を返すように指定する DISTINCT 節。 ストリーム・フィールドと一緒に使用することはできません。DISTINCT で BY(col-list) 従属節を指定できます。col-list には 1 つの列名、またはコンマ区切りの列名のリストを指定できます。
expression 任意の有効な式。普通は、カウント算出の対象となるデータ値を含む列の名前を指定します。
%FOREACH(col-list) オプション — 列名、またはコンマで区切られた列名のリスト。%FOREACH の詳細は、"SELECT" を参照してください。col-list にストリーム・フィールドを含めることはできません。
%AFTERHAVING オプションHAVING 節にある条件を適用します。

COUNT は、BIGINT データ型を返します。

概要

COUNT 集約関数には、以下の 2 つの形式があります。

  • COUNT(expression) は、expression の値の数をカウントして整数として返します。一般的に expression は、クエリで返される複数行の中のフィールド名 (または、フィールド名を 1 つ以上含む式) です。COUNT(expression) では NULL 値をカウントしません。重複フィールドの値は、オプションでカウントするかしないかを指定できます。COUNT は常に、xDBC 長が 8、有効桁数が 19、小数桁数が 0 のデータ型 BIGINT を返します。

  • COUNT(*) は、テーブル内の行数をカウントして整数として返します。COUNT(*) では、重複するフィールド値または NULL 値が存在するかどうかに関係なく、すべての行がカウントされます。

COUNT は、テーブルやビューを参照する SELECT クエリまたは SELECT サブクエリで使用できます。COUNT は、一般のフィールド値と共に SELECT リストや HAVING 節で使用できます。

COUNT は、WHERE 節では使用できません。SELECT がサブクエリの場合を除いて、JOINON 節では、COUNT を使用できません。

COUNT(expression) は、すべての集約関数と同様に、オプションの DISTINCT 節を取ることができます。DISTINCT 節は、個別 (一意) の値を持つそれらの列のみをカウントします。COUNT DISTINCT は、非重複値として NULL をカウントすることはありません。COUNT(DISTINCT BY(col2) col1) は、個別の col2 値の col1 値をカウントしますが、個別の col2 値には個別値として NULL が 1 つ含まれる場合があります。

ALL キーワードは、すべての重複値を含む、すべての非 NULL 値をカウントします。キーワードが指定されていない場合は、ALL が既定の動作になります。

行が返されない

行が選択されていない場合、COUNT はクエリに従って、0 か NULL のどちらかを返します。

  • 選択リストに、FROM 節テーブル内のフィールド (集約関数に提供されているフィールド以外) への参照が含まれていない場合、COUNT は 0 を返します。COUNT 集約関数のみが 0 を返し、その他の集約関数は NULL を返します。クエリは %ROWCOUNT 1 を返します。以下に例を示します。

      SET myquery = 3
      SET myquery(1) = "SELECT COUNT(*) AS Recs,COUNT(Name) AS People,"
      SET myquery(2) = "AVG(Age) AS AvgAge,MAX(Age) AS MaxAge,CURRENT_TIMESTAMP AS Now"
      SET myquery(3) = " FROM Sample.Employee WHERE Name %STARTSWITH 'ZZZ'"
      SET tStatement = ##class(%SQL.Statement).%New()
      SET qStatus = tStatement.%Prepare(.myquery)
        IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
      SET rset = tStatement.%Execute()
      DO rset.%Display()
      WRITE !,"Rowcount:",rset.%ROWCOUNT
  • 選択リストに、FROM 節テーブル内のフィールドへの直接参照が含まれている場合、または TOP 0 が指定されている場合、COUNT は NULL を返します。クエリは %ROWCOUNT 0 を返します。以下の例では、%ROWCOUNT の値が 0 のため、COUNT の値は返されません。

      SET myquery = 2
      SET myquery(1) = "SELECT COUNT(*) AS Recs,COUNT(Name) AS People,$LENGTH(Name) AS NameLen"
      SET myquery(2) = " FROM Sample.Employee WHERE Name %STARTSWITH 'ZZZ'"
      SET tStatement = ##class(%SQL.Statement).%New()
      SET qStatus = tStatement.%Prepare(.myquery)
        IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
      SET rset = tStatement.%Execute()
      DO rset.%Display()
      WRITE !,"Rowcount:",rset.%ROWCOUNT
    
  • テーブルが指定されていない場合、COUNT(*) は 1 を返します。クエリは %ROWCOUNT 1 を返します。以下に例を示します。

      SET myquery = "SELECT COUNT(*) AS Recs"
      SET tStatement = ##class(%SQL.Statement).%New()
      SET qStatus = tStatement.%Prepare(myquery)
        IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
      SET rset = tStatement.%Execute()
      DO rset.%Display()
      WRITE !,"Rowcount:",rset.%ROWCOUNT
    

ストリーム・フィールド

COUNT(expression) は、ストリーム・フィールド値のカウントに使用できますが、多少の制約があります。COUNT(streamfield) では、すべての非 NULL 値がカウントされます。値に重複があるかどうかはチェックされません。

expression がストリーム・フィールドである場合は、COUNT 関数の DISTINCT キーワードを指定できません。ストリーム・フィールドで DISTINCT キーワードを使用しようとすると、SQLCODE -37 エラーが返されます。

また、%FOREACH col-list でストリーム・フィールドを指定することはできません。これを実行しようとすると、SQLCODE -37 エラーが返されます。

以下の例は、COUNT 関数の有効な使用法を示しています。Title は文字列フィールド、Notes および Picture はストリーム・フィールドです。

SELECT DISTINCT Title,COUNT(Notes),COUNT(Picture %FOREACH(Title))
FROM Sample.Employee

Title が文字列フィールドで、Notes および Picture がストリーム・フィールドの場合、以下の例は有効ではありません

-- Invalid: DISTINCT keyword with stream field
SELECT Title,COUNT(DISTINCT Notes) FROM Sample.Employee
-- Invalid: %FOREACH col-list contains stream field
SELECT Title,COUNT(Notes %FOREACH(Picture))
FROM Sample.Employee

特権

COUNT(*) を使用するには、指定したテーブルに対するテーブルレベルの SELECT 特権が必要です。COUNT(column-name) を使用するには、指定した列に対する列レベルの SELECT 特権、または指定したテーブルに対するテーブルレベルの SELECT 特権が必要です。%CHECKPRIV コマンドを呼び出すことにより、現在のユーザが SELECT 特権を持っているかどうかを確認できます。$SYSTEM.SQL.CheckPriv()Opens in a new tab メソッドを呼び出すことにより、指定のユーザがテーブルレベルの SELECT 特権を持っているかどうかを確認できます。特権の割り当てについては、"GRANT" コマンドを参照してください。

パフォーマンス

COUNT のパフォーマンスを最適化するには、以下のようにインデックスを定義してください。

コミットされていないトラクザクションによる変更

すべての集約関数と同様、COUNT は常にデータの現在の状態を返します。現在のトランザクションの分離レベルを問わず、以下のようにコミット前の変更も現在の状態として扱われます。

  • COUNT は、挿入されたレコードや更新されたレコードを、その変更がコミットされておらず、ロールバックされる可能性がある場合でもカウントします。

  • COUNT は、削除されたレコードを、その削除がコミットされておらず、ロールバックされる可能性がある場合でもカウントしません

詳細は、"SET TRANSACTION" および "START TRANSACTION" を参照してください。

以下の例では、Sample.Person 内の行の合計数が返されます。

SELECT COUNT(*) AS TotalPersons
     FROM Sample.Person

以下の例では、Sample.Person 内の名前、配偶者、好きな色のカウントが返されます。これらのカウントは、一部の Spouse フィールドおよび FavoriteColors フィールドに NULL が含まれているために異なります。COUNT は、NULL をカウントしません。

SELECT COUNT(Name) AS People,
       COUNT(Spouse) AS PeopleWithSpouses,
       COUNT(FavoriteColors) AS PeopleWithColorPref
FROM Sample.Person

以下の例では、行の合計数、FavoriteColors フィールド内の非 NULL 値の合計数、FavoriteColors フィールド内の重複しない非 NULL 値の合計数といった 3 つの値が返されます。

SELECT COUNT(*) As TotalPersons,
       COUNT(FavoriteColors) AS WithColorPref,
       COUNT(DISTINCT FavoriteColors) AS ColorPrefs
       FROM Sample.Person

以下の例では、COUNT DISTINCT を使用して、Sample.Person の個別の FavoriteColors 値の数を返しています (FavoriteColors には、複数のデータ値と複数の NULL が含まれています)。また、この例では、DISTINCT 節を使用して、個別の FavoriteColors 値ごとに 1 行を返しています。DISTINCT は1 つの NULL に対して個別値として 1 行を返しますが、COUNT DISTINCT は NULL をカウントしないため、行数は COUNT(DISTINCT FavoriteColors) の数よりも 1 つ大きくなります。BY 節は 1 つの NULL を個別値としてカウントしないため、COUNT(DISTINCT BY(FavoriteColors) %ID) 値は行数と同じになります。

SELECT DISTINCT FavoriteColors,
       COUNT(DISTINCT FavoriteColors) AS DistColors,
       COUNT(DISTINCT BY(FavoriteColors) %ID) AS DistColorPeople
FROM Sample.Person

以下の例では、GROUP BY を使用して、FavoriteColors が NULL である行も含め、FavoriteColors 値ごとに行が返されるようにします。各行には 2 つのカウントが関連付けられています。1 つは、FavoriteColors オプション値ごとのレコード数のカウントです。FavoriteColors 値が NULL のレコードはカウントされません。もう 1 つは、FavoriteColors の各選択内容に関連付けられた名前の数のカウントです。値が NULL である Name は存在しないので、FavoriteColors の値が NULL である行もカウントできます。

SELECT FavoriteColors,
       COUNT(FavoriteColors) AS ColorPreference,
       COUNT(Name) AS People
       FROM Sample.Person
       GROUP BY FavoriteColors

以下の例では、Sample.Person 内の Home_State 値ごとに個人レコードのカウントが返されます。

SELECT Home_State, COUNT(*) AS AllPersons
     FROM Sample.Person
     GROUP BY Home_State

以下の例では、%AFTERHAVING を使用して、66 歳以上の人が 1 人以上いる各州の個人レコード数と 66 歳以上の人数が返されます。

SELECT Home_State, COUNT(Name) AS AllPersons,
     COUNT(Name %AFTERHAVING) AS Seniors
     FROM Sample.Person
     GROUP BY Home_State
     HAVING Age > 65
     ORDER BY Home_State

以下の例では、%FOREACH キーワードと %AFTERHAVING キーワードの両方を使用します。名前が “A”、“M”、または “W” で始まる人がいる州の行を返します。(HAVING 節と GROUP BY 節)。各州の行には以下の値があります。

  • COUNT(Name) : データベースに記録されているすべての人の数 (この数はすべての行で同じ値になります)。

  • COUNT(Name %FOREACH(Home_State)) : 州に存在するすべての人の数。

  • COUNT(Name %AFTERHAVING) : データベース内で、HAVING 節の条件を満たすすべての人の数 (この数はすべての行で同じ値になります)。

  • COUNT(Name %FOREACH(Home_State) %AFTERHAVING) : 州内の人のうち、HAVING 節の条件を満たすすべての人の数。

SELECT Home_State,
       COUNT(Name) AS NameCount,
       COUNT(Name %FOREACH(Home_State)) AS StateNameCount,
       COUNT(Name %AFTERHAVING) AS NameCountHaving,
       COUNT(Name %FOREACH(Home_State) %AFTERHAVING) AS StateNameCountHaving
FROM Sample.Person
GROUP BY Home_State
HAVING Name LIKE 'A%' OR Name LIKE 'M%' OR Name LIKE 'W%'
ORDER BY Home_State

以下の例では、連結式を使用する COUNT を示します。FavoriteColor フィールドの非 NULL 値の合計数、連結演算子 (||) で他の 2 つのフィールドと連結された FavoriteColors の 非 NULL 値の合計数を返します。

SELECT COUNT(FavoriteColors) AS Color,
       COUNT(FavoriteColors||Home_State) AS ColorState,
       COUNT(FavoriteColors||Spouse) AS ColorSpouse
       FROM Sample.Person

2 つのフィールドが連結されると、COUNT は、いずれのフィールドにも NULL 値がない行のみをカウントします。Sample.Person のすべての行に非 NULL の Home_State 値があるため、FavoriteColors||Home_State の連結では FavoriteColors と同じカウントが返されます。Sample.Person の行の中には Spouse が NULL 値のものがあるため、FavoriteColors||Spouse の連結では、FavoriteColors と Spouse の両方ともが NULL 値でない行のカウントが返されます。

関連項目

FeedbackOpens in a new tab