本記事では、、Oracleの「COUNT」について使い方を紹介していく。
COUNT:レコード件数を取得する
Oracleで「COUNT」を使用すると、レコード件数を取得することが可能だ。
GROUP BYやDISTINCTなどと合わせて使うことによって、
グループごとに件数を取得したりすることも可能であり、使用頻度は割と高い関数だ。
COUNTの使い方
COUNTの使い方は、以下のようになっている。
--テーブル1の件数を取得する
SELECT
COUNT(カウント列名)
FROM テーブル;
COUNTでレコード数を取得するサンプル
以下はCOUNTを使って、レコード数を取得するサンプルだ
--テーブル1の件数を取得する
SELECT
COUNT(*) AS 全列数,
COUNT(電話番号) AS 電話番号列数
FROM テーブル1;
--テーブル1
+------+--------------+
| 氏名 | 電話番号 |
+------+--------------+
| 太郎 | 080-1111-2222 |
| 次郎 | null |
| 三郎 | 080-1111-3333 |
| 四郎 | 080-1111-4444 |
| 五郎 | null |
+------+--------------+
--実行結果
+-------+------------+
| 全列数 | 電話番号列数 |
+------+-------------+
| 5| 3|
+------+-------------+
使い方は単純で、COUNT()の引数にレコード数取得用のキーを指定するだけだが、
「*」を指定するか「列名」を指定するかで若干挙動が変わってくるので注意が必要だ。
上記の例でいくと、
「*」を指定した場合はテーブル全体の5件が取得され、
「電話番号」を指定した場合はnullを除いた3件が取得されているのがわかる。
COUNT(*)よりCOUNT(列名)の方がパフォーマンスが高い
パフォーマンスを考えると、使える場面ではなるべく
COUNT(*)ではなく、COUNT(列名)を使用した方がパフォーマンスが高い。
(nullが存在しないなどの理由で)結果数が変わらないからとCOUNT(*)を乱用すると思わぬパフォーマンスの低下につながることがあるので頭の片隅に入れておこう。
グループ毎にCOUNTで件数を取得する
COUNTは、GROUP BYやDISTINCTなどと合わせて使うことによって、
グループごとに件数を取得したりすることも可能だ。
GROUP BYでグループ化する例
まずはGROUP BYでグループ化してからCOUNTする例を紹介する。
--テーブル1の件数を取得する
SELECT
動物 AS 動物名
COUNT(動物) AS 列数
FROM テーブル1
GROUP BY 動物名;
--テーブル1
+------+
| 動物 |
+------+
| かめ |
| いぬ |
| うし |
| うし |
| たぬき |
| たぬき |
| たぬき |
+------+
--実行結果
+-------+-----+
| 動物名 | 列数 |
+------+------+
| かめ | 1 |
| いぬ | 1 |
| うし | 2 |
| たぬき | 3 |
+------+------+
GROUP BYを使って、動物の種類ごとにグループ化した結果の件数を集計した。
それぞれの動物の合計数がCOUNTで取得できているのがわかるだろう。
DISTINCTでグループ化する例
最後にDISTINCTでグループ化してCOUNTする例を紹介する。
--テーブル1の件数を取得する
SELECT
COUNT(distinct 動物) AS 動物数
FROM テーブル1;
--テーブル1
+------+
| 動物 |
+------+
| かめ |
| いぬ |
| うし |
| うし |
| たぬき |
| たぬき |
| たぬき |
+------+
--実行結果
+------+
| 動物数 |
+------+
| 4 |
+------+
DISTINCTを使って、動物の種類の件数を集計した。
動物の種類の合計数がCOUNTで取得できているのがわかるだろう。
(グループ化と言っていいのかグレーゾーンだが、、広い意味でまとめてるのでよしとする)
関連記事
https://www.shift-the-oracle.com/sql/aggregate-functions/count.html
https://docs.oracle.com/cd/E82638_01/sqlrf/COUNT.html
「*」を指定 → テーブルの全列数を取得
「列名」を指定 → nullを除いた指定列名の列数を取得