0Pricing
SQL Interview Prep · レッスン

COUNT(*)、COUNT(column)、COUNT(DISTINCT)

各COUNT形式がNULLと重複値をどのように扱うかという、定番の質問を学びます。

「COUNT(*)、COUNT(column)、COUNT(DISTINCT)」はCoddyKit上の無料SQL Interview Prepレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Interview Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Interview Prepコースには全4レッスンが含まれています。

あなたに問われる質問

SQL の面接を受けるなら、最初の10分以内に次の質問が出ると考えてください: COUNT(*)、COUNT(column)、COUNT(DISTINCT column) の違いは何ですか?

一見簡単ですが、面接官はこの質問で、集約関数が NULL 値と重複をどのように扱うかを本当に理解しているか確認します。自信を持って正確に答えられれば、構文を暗記しただけでなく、実際のクエリを書いた経験があることを示せます。

このレッスンでは、すぐに答え、その理由まで説明できるように、確かなメンタルモデルを身につけます。

COUNT(*) は行を数える

COUNT(*) は行を数えます。列の値はまったく参照しないため、NULL は関係ありません。テーブルに100行あれば、COUNT(*) は必ず100を返します。

ここでのアスタリスクは、列を乗算したり展開したりするものではありません。「条件に合うすべての行を数える」という意味の特殊なトークンです。単に「レコード数はいくつか」を知りたいときに使う形式です。

SELECT COUNT(*) AS total_rows
FROM employees;

考えるためのサンプルデータ

まずは1つの小さなテーブルを基準に考えます。NULL を許容する department 列を持つ employees テーブルを想像してください:

  • Alice、営業
  • Bob、営業
  • Carol、NULL
  • Dan、エンジニアリング
  • Eve、NULL

合計で5行あります。3行には部署の値(営業、営業、エンジニアリング)があり、2行は NULL です。この数を覚えておいてください。このテーブルを3通りの方法で数えます。

COUNT(column) は NULL を除外する

COUNT(column) は、その列がNULL ではない行だけを数えます。NULL 値は完全に無視します。

サンプルデータでは、COUNT(department) は5ではなく3を返します。部署の値のうち2つが NULL だからです。このレッスン全体で最も重要な事実は、列に対する COUNT は NULL を決して数えないということです。

SELECT COUNT(department) AS depts_present
FROM employees;
-- returns 3 on our sample data

ここまでの2つを比較

同じ5行のテーブルで比較すると:

  • COUNT(*) = 5(すべての行)
  • COUNT(department) = 3(NULL ではない部署)

その差である 5 から 3 を引いた値は、NULL の部署数と等しくなります。面接で使える便利な小技として、COUNT(*) - COUNT(col) を使うと、別の WHERE 句を書かずにその列の NULL 数を求められます。

SELECT COUNT(*) - COUNT(department) AS null_departments
FROM employees;
-- returns 2

COUNT(DISTINCT column)

COUNT(DISTINCT column) は重複しない NULL ではない値の個数を数えます。まず重複を取り除き、次に NULL を無視して、残った値を数えます。

このデータで重複しない部署の値は営業とエンジニアリングなので、COUNT(DISTINCT department) は2を返します。2つの NULL は数えられず、重複する営業は1つにまとめられます。

SELECT COUNT(DISTINCT department) AS unique_depts
FROM employees;
-- returns 2

3つをまとめて比較

5行のテーブル全体をまとめると:

  • COUNT(*) = 5 — 行
  • COUNT(department) = 3 — NULL ではない値
  • COUNT(DISTINCT department) = 2 — 重複しない NULL ではない値

NULL を考慮し、次に重複を考慮するこの順序を言えるなら、概念全体を理解できています。それぞれの形式が、上の項目以下の値を返していることにも注目してください。

SELECT
  COUNT(*)                       AS rows_total,
  COUNT(department)              AS depts_present,
  COUNT(DISTINCT department)     AS unique_depts
FROM employees;

面接での応用問題

面接官は、よく質問を次のように応用します: 「部署に配属されている従業員は何人いて、異なる部署はいくつ存在しますか?」

前半は COUNT(department) です(配属されているとは NULL ではないという意味です)。後半は COUNT(DISTINCT department) です。それぞれの表現がどの COUNT に対応するかを見抜くことが、まさに試されているスキルです。

SELECT
  COUNT(department)          AS assigned_employees,
  COUNT(DISTINCT department) AS distinct_departments
FROM employees;

条件付きの COUNT

よくある追加質問は、条件を満たす行だけを数えることです。移植性の高い方法として、CASE 式に対して COUNT を使えます。COUNT(column) は NULL を除外するため、除外したい行に対して CASE が NULL を返すようにします。

ここでは営業部門の従業員を数えます。CASE は営業部門の行にだけ値を返し、それ以外では NULL を返すため、COUNT はその行だけを集計します。

SELECT
  COUNT(CASE WHEN department = 'Sales' THEN 1 END) AS sales_count
FROM employees;
-- returns 2

避けるべきよくある誤り

面接官が仕掛ける次の落とし穴に注意してください:

  • COUNT(column) が COUNT(*) と同じだと思うこと — 列に NULL が1つもない場合に限って同じになります。
  • COUNT(DISTINCT col) が NULL を1つの重複しない値として含むと思うこと — 含みません。
  • NULL を除外することを期待して COUNT(1) と書くこと — COUNT(*) と同じように動作し、すべての行を数えます。

面接では、理解の深さを示すために、これらを先に説明してください。

COUNT(1) と COUNT(constant)

候補者から、COUNT(*) と COUNT(1) のどちらが速いのかとよく質問されます。答えは、どちらも 意味的に同一であり、NULL に関係なくすべての行を数えるということです。最新のオプティマイザーは両者を同じように扱うため、実質的な性能差はありません。

COUNT(1) 内の定数が NULL になることはないため、行がスキップされることはありません。明確さを優先して COUNT(*) を使ってください。こちらが慣用的な形式です。

SELECT COUNT(*) AS a, COUNT(1) AS b
FROM employees;
-- a and b are always equal

クイックチェック

サンプルテーブルでメンタルモデルを確認してください。

まとめ

最もよく聞かれる集約に関する質問を、これで理解できました:

  • COUNT(*) は NULL を含むすべての行を数えます。
  • COUNT(column) はNULL ではない値だけを数えます。
  • COUNT(DISTINCT column) は重複しない NULL ではない値を数えます。
  • COUNT(*) - COUNT(col) を使えば、NULL の個数を追加の処理なしで求められます。
  • COUNT(1) は COUNT(*) と同じです — NULL の除外も速度差もありません。

簡潔に答え、その理由も説明してください。次は、SUM と AVG が NULL をどのように扱うかを学びます。

よくある質問

「COUNT(*)、COUNT(column)、COUNT(DISTINCT)」レッスンは無料ですか?

はい。「COUNT(*)、COUNT(column)、COUNT(DISTINCT)」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Interview Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Interview Prepコースには全4レッスンが含まれています。

「COUNT(*)、COUNT(column)、COUNT(DISTINCT)」で何を学びますか?

各COUNT形式がNULLと重複値をどのように扱うかという、定番の質問を学びます。 ブラウザで直接実行するハンズオンコードでSQL Interview Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

SQL Interview Prepを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSQL Interview Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「COUNT(*)、COUNT(column)、COUNT(DISTINCT)」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSQL Interview Prepレッスンでコードを書いて実行できますか?

はい。すべてのSQL Interview Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. COUNT(*)、COUNT(column)、COUNT(DISTINCT)
  2. NULLを含むSUMとAVG
  3. MIN、MAX、非数値の集計
  4. GROUP BYなしの集計
← SQL Interview Prepに戻る