15

COUNT(*) が何を意味しているのかわからないです。SQLの勉強をしています。

SELECT age, COUNT(*)
FROM users
GROUP BY age;

というコードがありました。全てのユーザーを年齢ごとにグループ化し年齢と年齢ごとの人数をusersテーブルから取得してくるという内容なのですが、なぜCOUNT(*)の()の中は*が指定されているのでしょうか?*は全てという意味で、この場合だとCOUNT(age) になるのかなと。

RIRIN
  • 339
  • 1
  • 3
  • 8

2 Answers2

12

COUNT(*) が何を意味しているのかわからないです。

「*」はテーブルの全カラムを表すので、以下のようなイメージで考えるといいと思います。

画像の説明をここに入力

基本的に、グループ化した場合はどちらも同じ行数になりますが、@payaneco さんが仰るように、nullの扱いに気をつける必要があります。

Kohei TAMURA
  • 5,187
  • 2
  • 11
  • 23
11

OracleではCOUNT(*)COUNT(age)の結果は異なります。
ageにnullが入っているとCOUNT(age)では件数にカウントされません。
グループ化していても同様で、ageがnullのグループのみ0件となります。
COUNT(*)ではageにnullが入っていてもレコードの件数をカウントします。

COUNT(*)ではレコードの内容を取得するため、COUNT('X')SUM(1)を使った方が高速化できると教わったことがあります。(10年ほど前に聞いたノウハウなので現在も適用されるのかは不明ですが…)

payaneco
  • 12,323
  • 21
  • 57