LoginSignup
7
6

More than 3 years have passed since last update.

Countのカッコの中身って何書く?

Posted at

最近、仕事中に話題になったので、調べてみました。
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

「*」か「expr」(式)を指定する感じですね。

結論

パフォーマンスを抜きに考えた場合、
NULLをカウントするかどうかで、選択が変わりますね。

NULLをカウントする場合

  • COUNT(*)

かな。

列に対して、カウントを取りたい場合

  • COUNT(列名)
  • COUNT(DISTINCT 列名)

かな。

パフォーマンスを考えた場合は?は、実行計画を見て考えるべき。
個人的には、「*」で良いと思いますが。

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6