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 2COUNT(DISTINCT column)
COUNT(DISTINCT column) は重複しない NULL ではない値の個数を数えます。まず重複を取り除き、次に NULL を無視して、残った値を数えます。
このデータで重複しない部署の値は営業とエンジニアリングなので、COUNT(DISTINCT department) は2を返します。2つの NULL は数えられず、重複する営業は1つにまとめられます。
SELECT COUNT(DISTINCT department) AS unique_depts
FROM employees;
-- returns 23つをまとめて比較
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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- COUNT(*)、COUNT(column)、COUNT(DISTINCT)
- NULLを含むSUMとAVG
- MIN、MAX、非数値の集計
- GROUP BYなしの集計