SQLでは、 COUNT()
functionは、グループ内で見つかったアイテムの数を返す集計関数です。
COUNT()
を使用できます クエリの複数の部分で。たとえば、 SELECT
で使用できます リスト、または HAVING
グループをフィルタリングするときの句。
サンプルテーブル
次の表があるとします。
SELECT * FROM Pets;
結果:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+
次の例では、 COUNT()
を使用します このテーブルをクエリするときに機能します。
例
始めるための簡単な例を次に示します。
SELECT COUNT(*) AS Count
FROM Pets;
結果:
+---------+ | Count | |---------| | 8 | +---------+
これは、テーブルに8行あることを示しています。アスタリスクのワイルドカード( *
を使用したため、 )すべての行とすべての列を指定します。
特定の列を数える
カウントする特定の列を指定することもできます。 COUNT()
関数はNULL
以外のみをカウントします 結果として、 NULL
を含む列を指定した場合 値、それらの値はカウントされません。
これが私の意味を示す例です。
SELECT COUNT(DOB) AS Count
FROM Pets;
結果:
+---------+ | Count | |---------| | 6 | +---------+ Warning: Null value is eliminated by an aggregate or other SET operation.
この場合、 Pets
テーブルには2つのNULL
が含まれています DOB
の値 列(2匹のペットは生年月日を提供していません)なので、 COUNT(DOB)
COUNT(*)
を使用した場合、8ではなく6を返します 。
理由COUNT(*)
前の例では、すべての行が返されました。これは、これらの2つの行がしたためです。 他の列にデータがあります。
私の例では、DBMSもこれに関する警告を返しました。 DBMSと特定の構成に応じて、警告が表示される場合と表示されない場合があります。
フィルタリングされた結果
COUNT()
関数は、クエリによって返された行をカウントします。したがって、結果をフィルタリングすると、 COUNT()
の結果になります。 それを反映します。
SELECT COUNT(*) AS Count
FROM Pets
WHERE PetName = 'Fluffy';
結果:
+---------+ | Count | |---------| | 2 | +---------+
この場合、Fluffyという名前のペットが2匹います。したがって、クエリによって2つの行が返され、 COUNT()
の結果が返されます。 2
です 。
個別の列を数える
デフォルトでは、 COUNT()
関数には暗黙のALL
が含まれます キーワード。これは、結果に重複が含まれていることを意味します。
ただし、 DISTINCT
を追加するオプションもあります 個別の値のみが返されるように指定するキーワード。つまり、重複を除外するように指定できます。
PetName
を選択しましょう 桁。上記の元の表を見ると、 PetName
であることがわかります。 列には、同じ値の2つの行が含まれます( Fluffy
。
まず、 COUNT(ALL PetName)
を実行します 重複するすべての値をカウントに含めるクエリ:
SELECT COUNT(ALL PetName) AS Count
FROM Pets;
結果:
+---------+ | Count | |---------| | 8 | +---------+
したがって、8つの行があります。これは、 ALL
を含めなかった場合に得られる結果と同じであることを忘れないでください キーワード、 ALL
デフォルトです。
次に、 COUNT(DISTINCT PetName)
を実行します カウントから重複を排除します。
SELECT COUNT(DISTINCT PetName) AS Count
FROM Pets;
結果:
+---------+ | Count | |---------| | 7 | +---------+
今回の結果は7
です。 。これは、重複する値が削除されたためです。つまり、重複する値は、値が1つしかないかのように扱われました。
COUNT()
の使用 HAVING
で 条項
COUNT()
を含めることができます クエリの複数の部分で機能します。 SELECT
だけに限定されません リスト。
COUNT()
を使用する例を次に示します。 両方のHAVING
句とSELECT
リスト。
SELECT
PetTypeId,
COUNT(PetTypeId) AS Count
FROM Pets
GROUP BY PetTypeId
HAVING COUNT(PetTypeId) > 2
ORDER BY Count DESC;
結果:
+-------------+---------+ | PetTypeId | Count | |-------------+---------| | 3 | 4 | | 2 | 3 | +-------------+---------+
この場合、 HAVING
を使用しました GROUP BY
と組み合わせた句 COUNT(PetTypeId)
を持つ行のみを返す句 2
より大きい 。
)初心者向けの演算子」>演算子よりも大きい(>
)だけに限定されません。 ) HAVING
を使用する場合 句。 WHERE
で使用できるのと同じ演算子を使用できます 句( =
など) 、)初心者向け演算子"> <
、 =)初心者向け演算子>>> =
、 IN
、 LIKE
など)。
SQLで使用可能な演算子のリストについては、SQL演算子を参照してください。
ウィンドウ関数
DBMSによっては、 OVER
を使用できる場合があります COUNT()
を含む句 ウィンドウ関数を作成する関数。
ウィンドウ関数は、一連のクエリ行に対して集計のような操作を実行します。クエリ行ごとに結果が生成されます。これは、クエリ行を単一の結果行にグループ化する集計操作とは対照的です。
概念を示す例を次に示します。
すでにPets
を見てきました テーブル。私たちのデータベースにはOwners
もあります テーブルであり、次のデータが含まれています:
+-----------+-------------+------------+----------------+-------------------+ | OwnerId | FirstName | LastName | Phone | Email | |-----------+-------------+------------+----------------+-------------------| | 1 | Homer | Connery | (308) 555-0100 | [email protected] | | 2 | Bart | Pitt | (231) 465-3497 | [email protected] | | 3 | Nancy | Simpson | (489) 591-0408 | NULL | | 4 | Boris | Trump | (349) 611-8908 | NULL | | 5 | Woody | Eastwood | (308) 555-0112 | [email protected] | | 6 | Burt | Tyson | (309) 565-0112 | [email protected] | +-----------+-------------+------------+----------------+-------------------+
これらのテーブルからデータを取得し、結合を使用して1つの結果セットとして表示できます。
COUNT()
を使用することもできます OVER
で機能する データにウィンドウ関数を適用する句。
SELECT
CONCAT(o.FirstName, ' ', o.LastName) AS Owner,
p.PetName,
COUNT(PetId) OVER (PARTITION BY CONCAT(o.FirstName, ' ', o.LastName)) AS "Number of pets from this owner"
FROM Owners o
INNER JOIN Pets p
ON p.OwnerId = o.OwnerId
ORDER BY "Number of pets from this owner" DESC;
結果:
+---------------+-----------+----------------------------------+ | Owner | PetName | Number of pets from this owner | |---------------+-----------+----------------------------------| | Nancy Simpson | Wag | 3 | | Nancy Simpson | Fluffy | 3 | | Nancy Simpson | Fetch | 3 | | Bart Pitt | Scratch | 2 | | Bart Pitt | Bark | 2 | | Boris Trump | Meow | 2 | | Boris Trump | Fluffy | 2 | | Homer Connery | Tweet | 1 | +---------------+-----------+----------------------------------+
この場合、 OVER
を使用しました COUNT()
を含む句 カウントを所有者の名前だけに分割する句。
その結果、複数のペットを飼っている飼い主が複数の行に表示され(各ペットも表示する必要があるため)、各行にはその飼い主のペットの総数が含まれます。
この概念は、 SUM()
などのSQLの他の集計関数にも適用できます。 、 MIN()
、 MAX()
、および AVG()
。
COUNT_BIG()
SQL Serverで非常に大きなデータセットをカウントしている場合は、 COUNT()
が見つかる可能性があります。 数値が大きすぎるため、関数はエラーを生成します。これは、カウントが2,147,483,647を超える場合にのみ発生します。
このような場合は、 COUNT_BIG()
を使用できます。 、これははるかに大きな数に対応できます。
COUNT_BIG()
の方法をご覧ください SQLServerおよびCOUNT()
で動作します vs COUNT_BIG()
詳細な説明については。
ANSISQL標準
COUNT()
関数はSQL標準にリストされており、主要なDBMSのほとんど(すべてではないにしても)で使用可能であり、それらの間でほぼ同じように機能します。
さまざまなDBMSで行われるコード例については、SQLite COUNT()
を参照してください。 、コード> SQL Server
COUNT()
、およびMySQL COUNT()
。