最近、仕事中に話題になったので、調べてみました。
COUNTのカッコの中身って何書くのか?
パターンはこんな感じ
今まで現場で見てきた内容に加えて、調べた内容を書いています。
- COUNT(*)
- COUNT(列名)
- COUNT(ALL 列名)
- COUNT(DISTINCT 列名)
- COUNT(0)
- COUNT(1)
COUNT(ALL 列名)、COUNT(DISTINCT 列名)は、現場で見たことが無かったです。
調べたら出てきました。
じゃあ、違いは?
じゃあ、違いは?というと、実際に実行してみました。
# 久々に自宅のPCにOracleを入れてみましたが、いつのまにか、19cになっていたんですねw
こんなcount_testテーブル。
TEST_ID | TEST_VAL |
---|---|
TEST1 | TESTVAL1 |
TEST2 | TESTVAL3 |
TEST2 | TESTVAL2 |
TESTVAL4 |
で、以下のSQLを実行すると、
SELECT
COUNT(*) -- 「*」
,COUNT(test_id) -- 「列名」
,COUNT(ALL test_id) -- 「ALL 列名」
,COUNT(DISTINCT test_id) -- 「DISTINCT 列名」
,COUNT(0) -- 「定数」
,COUNT(1) -- 「定数」
FROM
count_test;
こんな感じ。分かり易いように立てにしています。
列名 | 件数 | 内容 |
---|---|---|
COUNT(*) | 4 | NULL含めての件数 |
COUNT(TEST_ID) | 3 | NULLを除いたTEST_IDの件数 |
COUNT(ALL TEST_ID) | 3 | NULLを除いたTEST_IDの件数 |
COUNT(DISTINCT TEST_ID) | 2 | NULLを除いたTEST_IDをユニークとした件数 |
COUNT(0) | 4 | NULLを含めた件数 |
COUNT(1) | 4 | NULLを含めた件数 |
こう見ると、COUNT(*)、COUNT(0)、COUNT(1)は、一緒ですね。
後は、COUNT(TEST_ID)、COUNT(ALL TEST_ID)も、一緒ですね。
そもそも、関数の仕様は?
オラクルの公式ページの関数を見てみると、
[SQL Language Reference: COUNT]
(https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/COUNT.html#GUID-AEF08B79-024D-4E3A-B362-9715FB011776)
「*」か「expr」(式)を指定する感じですね。
結論
パフォーマンスを抜きに考えた場合、
NULLをカウントするかどうかで、選択が変わりますね。
NULLをカウントする場合
- COUNT(*)
かな。
列に対して、カウントを取りたい場合
- COUNT(列名)
- COUNT(DISTINCT 列名)
かな。
パフォーマンスを考えた場合は?は、実行計画を見て考えるべき。
個人的には、「*」で良いと思いますが。