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 | example@sqldat.com | | 2 | Bart | Pitt | (231) 465-3497 | example@sqldat.com | | 3 | Nancy | Simpson | (489) 591-0408 | NULL | | 4 | Boris | Trump | (349) 611-8908 | NULL | | 5 | Woody | Eastwood | (308) 555-0112 | example@sqldat.com | | 6 | Burt | Tyson | (309) 565-0112 | example@sqldat.com | +-----------+-------------+------------+----------------+-------------------+
これらのテーブルからデータを取得し、結合を使用して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() 。