テーブル内のレコードの件数(テーブルの行数)を取得するSQLを紹介します。
テーブルのレコードの数(テーブル行数)を求めるには COUNT 関数を利用します。
COUNT関数の書式は次の通りです。
または
条件を指定する場合は次の書式を利用します。
または
DISTINCT を利用し重複を除去する場合の書式は以下です。
id | name | price | category |
---|---|---|---|
1 | Penguin | 250 | Bird |
2 | Bear | 1050 | Mammal |
3 | Duck | 150 | Bird |
4 | Camel | 550 | Mammal |
5 | Owl | 185 | Bird |
6 | Whale | 880 | Mammal |
上記のテーブルでレコードの個数を求める場合は以下のSQLを実行します。
SELECT COUNT(*) FROM products
結果は以下となります。
(列名なし) |
---|
6 |
列名を付ける場合は以下のSQLを実行します。
SELECT COUNT(*) as cnt FROM products
または、下記でも同様の結果が得られます。
SELECT cnt=COUNT(*) FROM products
結果は以下となります。
cnt |
---|
6 |
id | name | price | category |
---|---|---|---|
1 | Penguin | 250 | Bird |
2 | Bear | 1050 | Mammal |
3 | Duck | 150 | Bird |
4 | Camel | 550 | Mammal |
5 | Owl | 185 | Bird |
6 | Whale | 880 | Mammal |
上記のテーブルで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 |
id | model | name | category | price |
---|---|---|---|---|
1 | C-XM01 | モーダンチェア | チェア | 56000 |
2 | X-XD05 | ラージデスク | テーブル | 87000 |
3 | A-DA40 | ラウンドダイニングチェア | チェア | 28000 |
4 | O-XX100 | ナチュラルオフィス | チェア | 13800 |
5 | R-D400 | ラウンドダイニングテーブル | テーブル | 128000 |
6 | R7000 | ウッドキャビネット | その他 | 32000 |
上記のテーブルにて、category ごとのレコード数を求める場合は以下のSQLを実行します。
SELECT category, COUNT(id) AS cnt FROM products GROUP BY category
結果は以下となります。
category | cnt |
---|---|
その他 | 1 |
チェア | 3 |
テーブル | 2 |
重複したレコードを除去してレコード数を取得する場合には、DISTICT文を利用します。
DISTINCTの詳細はこちらの記事を参照してください。
以下のテーブルを用意します。
id | model | name | category | price |
---|---|---|---|---|
1 | C-XM01 | モーダンチェア | チェア | 56000 |
2 | X-XD05 | ラージデスク | テーブル | 87000 |
3 | A-DA40 | ラウンドダイニングチェア | チェア | 28000 |
4 | O-XX100 | ナチュラルオフィス | チェア | 13800 |
5 | R-D400 | ラウンドダイニングテーブル | テーブル | 128000 |
6 | R7000 | ウッドキャビネット | その他 | 32000 |
7 | B-250 | ホワイトダブルベッド | ベッド | 184500 |
以下のSQL文を実行します。category が同じものはまとめて1レコードとしてレコード数を求めます。
SELECT DISTINCT COUNT(DISTINCT category) AS cnt FROM products
結果は以下となります。カテゴリが "チェア" "テーブル" "ベッド" "その他" の4レコードにまとめられるためです。
cnt |
---|
4 |
西日の射しこむコンピュータ教室。モニタに映る黒いターミナルの画面には、白いカーソルが瞬いている。
キーボードをたたく音と、窓の外を走る部活の掛け声が遠くに混ざるなか、担任の田中先生が手を叩いた。
「はい、次は“件数”を数える関数ね。――誰か覚えている?」
前列の愛莉が素早く手を挙げる。
「COUNT です!」
先生が満足げにうなずき、データベースに用意された〈products〉テーブルを投影した。
id | name | price | category |
---|---|---|---|
1 | Penguin | 250 | Bird |
2 | Bear | 1050 | Mammal |
3 | Duck | 150 | Bird |
4 | Camel | 550 | Mammal |
5 | Owl | 185 | Bird |
6 | Whale | 880 | Mammal |
「全部でいくつあるか数えてみて」
美優がタイピングし、エンターキーが軽やかに鳴る。
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 字で書いて、来週までに提出!」
――今日の授業、件数はきっちり数えられたのに、宿題の量だけは誰もカウントしきれずに終わった。