レコードの件数を取得する (COUNT 関数の利用)

テーブル内のレコードの件数(テーブルの行数)を取得するSQLを紹介します。

概要

テーブルのレコードの数(テーブル行数)を求めるには COUNT 関数を利用します。

メモ
レコードの数ではなく、レコードのフィールドの値の合計を求める場合はSUM関数を利用します。詳しくは、こちらの記事を参照してください。

書式

COUNT関数の書式は次の通りです。

SELECT COUNT(*) FROM (テーブル名)

または

SELECT COUNT((列名)) FROM (テーブル名)
補足
実行速度の向上のため、多くの場合でidとして設定されている列名を使用することが多いです。
SELECT COUNT((id列名)) FROM (テーブル名)


条件を指定する場合は次の書式を利用します。

SELECT COUNT(*) FROM (テーブル名) WHERE (条件式)

または

SELECT COUNT((列名)) FROM (テーブル名) WHERE (条件式)


DISTINCT を利用し重複を除去する場合の書式は以下です。

SELECT COUNT(DISTINCT (重複を判定する列名)) FROM (テーブル名)

例1:テーブルのすべてのレコード数を取得する

products テーブル
idnamepricecategory
1Penguin250Bird
2Bear1050Mammal
3Duck150Bird
4Camel550Mammal
5Owl185Bird
6Whale880Mammal


上記のテーブルでレコードの個数を求める場合は以下のSQLを実行します。

SELECT COUNT(*) FROM products

結果

結果は以下となります。

(列名なし)
6

補足

列名を付ける場合は以下のSQLを実行します。

SELECT COUNT(*) as cnt FROM products

または、下記でも同様の結果が得られます。

SELECT cnt=COUNT(*) FROM products

結果

結果は以下となります。

cnt
6

例2:条件を指定してレコード数を取得する

products テーブル
idnamepricecategory
1Penguin250Bird
2Bear1050Mammal
3Duck150Bird
4Camel550Mammal
5Owl185Bird
6Whale880Mammal


上記のテーブルでcategoryが"Bird"レコードの個数を求める場合は以下のSQLを実行します。

SELECT COUNT(*) FROM products WHERE category='Bird'

結果

結果は以下となります。

(列名なし)
3

補足

列名を付ける場合のSQLは以下になります。

SELECT COUNT(*) AS cnt FROM products WHERE category='Bird'

または

SELECT cnt=COUNT(*) FROM products WHERE category='Bird'

結果

結果は以下となります。

cnt
3

例3: GROUP BY を用いたグループごとの集計

products テーブル
idmodelnamecategoryprice
1C-XM01モーダンチェアチェア56000
2X-XD05ラージデスクテーブル87000
3A-DA40ラウンドダイニングチェアチェア28000
4O-XX100ナチュラルオフィスチェア13800
5R-D400ラウンドダイニングテーブルテーブル128000
6R7000ウッドキャビネットその他32000


上記のテーブルにて、category ごとのレコード数を求める場合は以下のSQLを実行します。

SELECT category, COUNT(id) AS cnt FROM products GROUP BY category

結果

結果は以下となります。

categorycnt
その他1
チェア3
テーブル2

例4: 重複を除去したレコード数の取得

重複したレコードを除去してレコード数を取得する場合には、DISTICT文を利用します。 DISTINCTの詳細はこちらの記事を参照してください。

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

products テーブル
idmodelnamecategoryprice
1C-XM01モーダンチェアチェア56000
2X-XD05ラージデスクテーブル87000
3A-DA40ラウンドダイニングチェアチェア28000
4O-XX100ナチュラルオフィスチェア13800
5R-D400ラウンドダイニングテーブルテーブル128000
6R7000ウッドキャビネットその他32000
7B-250ホワイトダブルベッドベッド184500


以下のSQL文を実行します。category が同じものはまとめて1レコードとしてレコード数を求めます。

SELECT DISTINCT COUNT(DISTINCT category) AS cnt FROM products

結果

結果は以下となります。カテゴリが "チェア" "テーブル" "ベッド" "その他" の4レコードにまとめられるためです。

cnt
4

A.W.S (Another World Story)

レコードの件数を取得する (COUNT 関数の利用):画像1

西日の射しこむコンピュータ教室。モニタに映る黒いターミナルの画面には、白いカーソルが瞬いている。 キーボードをたたく音と、窓の外を走る部活の掛け声が遠くに混ざるなか、担任の田中先生が手を叩いた。

「はい、次は“件数”を数える関数ね。――誰か覚えている?」

前列の愛莉が素早く手を挙げる。
「COUNT です!」

先生が満足げにうなずき、データベースに用意された〈products〉テーブルを投影した。

products テーブル
idnamepricecategory
1Penguin250Bird
2Bear1050Mammal
3Duck150Bird
4Camel550Mammal
5Owl185Bird
6Whale880Mammal


「全部でいくつあるか数えてみて」
美優がタイピングし、エンターキーが軽やかに鳴る。

SELECT COUNT(*) FROM products;

――返ってきた数字は 6。

「じゃあ、“Bird” だけなら?」
愛莉が続けて入力する。

SELECT COUNT(*) FROM products WHERE category='Bird';

結果は 3。

「次はグループごとに集計してみようか」
田中先生の言葉に、莉佳が首をかしげながら書く。

SELECT category, COUNT(id) AS cnt
FROM products
GROUP BY category;


鳥が3、哺乳類が3、と画面に整然と並んだ。

教室の空気が温まり、誰かが小さくあくびをかみ殺すころ、先生が最後の問いを投げた。
「じゃあ、自分たちのクラスで出席を取るつもりで書いてごらん。“今日来ている人” だけ数えたいときは?」

クラスメイト全員の名前を仮想テーブル〈students〉に INSERT して、欠席者の行には attendance を NULL、出席者には 1 を入れる ――そんなシナリオで実践することになった。愛莉が仕上げたクエリはこうだ。

SELECT COUNT(attendance) FROM students;


結果は 34。

「え? うちのクラスは35人のはずなのに…」

ざわめく中、美優がうつむき、頬を赤くする。
「ご、ごめん。さっき自分の行、attendance 入れ忘れて NULL のまま登録しちゃった…」

教室に笑いがはじける。田中先生が黒板にチョークで大きく書いた。

COUNT(*) —— NULL も数える
COUNT(column) —— NULL を無視

「つまり、『出席したかどうか書き忘れた人』は、データベース的には“存在しない”ことになるわけだね」

最後のチャイム。窓の外の空は茜色。
「出席取りは忘れずに、“”マークじゃなくて 1 を入れること!」

NULLのまま存在感を消しかけた美優が、「でも欠席扱いにならなくてラッキーかも」と呟いた瞬間、
「0 件じゃなくて“欠席1 件”でカウントするクエリもあるのよ!」
――先生の追い打ちに、教室は再びどっと沸いた。

数えても数えても、油断するとこぼれ落ちるレコード。
COUNT は正直だけれど、入力ミスまでは面倒を見てくれない。
帰り支度をしながら愛莉がぼそりと漏らした。
「やっぱり人生も SQL も、NULL は怖いね」

その一言を聞いた田中先生、
「そうか、じゃあ宿題。“NULL にしない人生設計” を 800 字で書いて、来週までに提出!」

――今日の授業、件数はきっちり数えられたのに、宿題の量だけは誰もカウントしきれずに終わった。

AuthorPortraitAlt
著者
iPentec.com の代表。ハードウェア、サーバー投資、管理などを担当。
Office 365やデータベースの記事なども担当。
作成日: 2014-07-22
改訂日: 2024-04-06
Copyright © 1995–2025 iPentec all rights reserverd.