web-dev-qa-db-ja.com

COUNT(*)は常に結果を返しますか?

次のようなクエリを実行した場合:

SELECT COUNT(*) as num FROM table WHERE x = 'y'

クエリがどのレコードとも一致しない場合でも、常に結果が返されますか?または、結果として行が返されることを検証して確認する必要がありますか?

33
Click Upvote

はい、それは集計であり、ゼロを返すためです。 GROUP BYを追加しない限り、グループがないため結果はありません。

GROUP BYを追加して行を追加しない限り、MAX/SUMなどはNULLを返します。 COUNTのみが結果なしの数値を返します

編集、少し遅れて:SUMはMAXのようにNULLを返します

編集、2013年5月:これはすべてのメインRDBMSに適用されます。私はANSI規格に従って推測します

46
gbn

はい、"count"関数自体の戻り値は例外なく常にnull以外の整数です。

そうは言っても、実際には結果セットであるクエリの戻り値にもっと興味があるかもしれません。その場合は、クエリに「groupby」句が含まれているかどうかを検討するだけです。

グループ化されていないクエリ次のような集計関数

select count(*), sum(*), max(*), min(*) from table

単一のレコードで結果セットを生成します集計関数の戻り値を含みます。この場合、結果セットには常に1つのレコードが含まれ、列には、含めた集計関数の戻り値が含まれます。この唯一のレコード内では、countの戻り値は常にnull以外の整数になりますが、min、max、sumなどの他の集計関数の戻り値はnullになる可能性があります。上記の例では、返されるレコードは「zero、null、null、null」である可能性がありますが、countがnullを返すことはないため、「null、null、null、null」になることはありません。したがって、「count」のみを呼び出している場合、返される1つのレコードのその1つの列には、常にcountのnull以外の戻り値が含まれます。したがって、カウントクエリのスカラー戻り値は常にnull以外の整数になるので安心できます。

一方、グループ化されたクエリのような集計関数を使用する

select count(*), sum(*), max(*), min(*) from table group by column

個以上のレコードで結果セットを生成しますここで、各レコードには、識別された各グループの集計関数の戻り値が含まれます。この場合、識別されたグループがない場合、集計関数を実行するグ​​ループはなく、関数は実行されず、「クエリの戻り値」はレコードのない空のセットになります。

レコードのないテーブルでテストして、結果を確認します。

create table #t (c int);
select COUNT(c), MIN(c), MAX(c), SUM(c) from #t; --returns one record {0, null, null, null}
select COUNT(c), MIN(c), MAX(c), SUM(c) from #t group by c; --returns no records
drop table #t;

したがって、count、min、max、sumのいずれを呼び出す場合でも、個々の集計関数の戻り値だけでなく、クエリ自体の「戻り値」と、その結果セットに含まれる内容を理解することが重要です。

8
Triynko

集計関数Count()は常に値を返します

5
Axarydax

はい、常に数値を返します

2
Midhat

はい、そのような場合は0を返します。

2
reko_t

次のような結果の行が常にあります。

| COUNT(*) |
------------
| 0        |

一致するものがない場合。

ちなみに、*ではなく主キーだけを数えたいと思います。

2
mauris

一致するレコードがない場合、カウントは0を返します(したがって、構文エラーがない限り、カウントは常に結果を返します)

2
Omry Yadan