COUNT(*), COUNT(1), COUNT(expr) の違いを SQL 標準から理解する
BRANK

!Disclaimer #1: 筆者は Snowflake で Senior Performance Engineer として働いていますが、この記事は公式の見解ではなく、あくまでも個人的な内容になります。IntroCOUNT(*), COUNT(1), COUNT(expr) の違いについて、おそらく NULL の扱いだったり、パフォーマンスだったりが違うんだろうな、という経験的に得られた知識があると思いますが、これを ANSI SQL 標準 (ISO/IEC 9075-2:2016) を元に体系的に整理します。ANSI SQL における COUNT 集約関数の定義ISO/IEC 9075-2:2016 の "4.16.4 Aggregate functions" にて、COUNT (および単一引数の集約関数) は下記のように定義されています。COUNT(*) は集約内の行数を返すそれ以外の単一引数の集約関数は、任意の <value expression> を引数に取る各行に対する <value expression> について、下記を満たす行を除外する:DISTINCT キーワードがある場合、重複値になる行<value expression> が NULL に評価される行上記のルール適用後に、何も行が残らなかった場合、COUNT は 0 を、それ以外の単一引数の集約関数は NULL を返すCOUNT <value expression> は、上記のルール適用後の集約内の行数を返すこの定義をベースに、各記…

zenn.dev
Related Topics: SQL