count()で集計をとる | SQL超初心者の勉強

2020-04-14

テーブルから必要な項目の数を数えるときにcount()を使います。
しかし、どのように使うのかわからなかったので調べてみました。

動作環境

SQL FIDDLEでOracle11g R2、MySQL5.6、PostgreSQL9.6、SQLiteで動作確認しました。
下記文章は主にPostgreSQLで仕様で調べています。

COUNT()について

構文

COUNT (* | [DISTINCT] ALL | column_name)

構文の説明

名称説明
column_nameカラムの名前
*(*)アスタリスクは全ての行
DISTINCTオプションで重複除去する 省略可
ALLオプションでデフォルト値なので特に気にする必要なし
(Distinctを書かない場合ALLが実行される)

書き方例

全ての行数をカウント

COUNT(*)

全ての行数をカウントします。

数えたい要素を指定してカウント

count(列名)

例えばnameの列をカウントする時は以下のようになります。
例 : count(name)
この場合nameの列の値をカウントしますが、nullはカウントしません。

count(ALL name)と書いても同じ動きになします。
※ count(name)と同じ=省略可能

重複を除去してカウント

count(Distinct 列名)

重複する項目を除いてカウントします。

実際の書き方例

テーブルを準備

以下のテーブルを使用します。

itemitemnm
(null)あいう
1かきく
3かきく

上記テーブル作成コードです。

-- CREATE TABLEでテーブル作成
create table test2(
item integer
,itemNm varchar(20)
);

-- 値をインサート
insert INTO  test2 values(null, 'あいう'), (1, 'かきく'), (3, 'かきく');

COUNTを使ったSELECT文の例 

全ての行数をカウント

-- 行を集計
select count(*) from test2;

■ 結果
count  3

全ての行数からitemがNULLのものをカウント

-- Nullを集計
select count(*) from test2 where item IS NULL

■ 結果
count  1

全ての行数からitemが1のものをカウント

-- itemが1のものを集計
select count(*) from test2 where item = 1

■ 結果
count  1

itemの項目をカウント

SELECT COUNT( item ) from test2;

■ 結果
count  2

※ 項目数が2つあるから

itemNmから重複する項目を除いてカウント

-- 重複を除く
SELECT COUNT( DISTINCT itemNm) from test2;

■ 結果
count  2

参考サイト:https://w3resource.com/PostgreSQL/postgresql-count-function.php

count()以外と併用して使う場合

count()単体で使う分には問題ないですが、他のカラムと使う場合Group Byでグループ化する必要があります。グループ化しないとcountする項目が1行ずつになってしまい意味がないですもんね。

SELECT
itemNm,
Count(itemNm)
FROM
test2
Group by
itemNm

この場合SELECTで選んだ項目をGroup化する必要があります。

■ 結果

itemnmcount
かきく2
あいう1

余談

余談ですがCOUNT()を書いていてMySQLでなぜかエラーになってしまうことがあったのですが、COUNT()のCOUNTと()の間にスペースが入っていてエラーになってしまいました。うっかりスペースを入れないように気をつけようと思います。