どうも、hosigakiです!
今日は華金ですね、皆さん一週間お疲れ様です!(^^)/
SQLを勉強したての頃、COUNT(*)
とCOUNT(カラム名)
の違いが分からず苦戦した記憶があります。ということで、今回はこれらの違いについて説明したいと思います!
二つの違いを一言で言うと
COUNT(*)とCOUNT(カラム名)の違いを一言で言うと、
NULLをカウントするか否か
に尽きます!
COUNT(*)
はNULLをカウントして、COUNT(カラム名)
はNULLをカウントしない、という違いがあります!
クエリで違いを調べてみよう!
実際にクエリで二つの違いを確かめてみましょう!
今回は、以下のシンプルなテーブルを使って、ユーザー数をカウントするとします。
id | name |
---|---|
1 | 太郎 |
2 | よしお |
3 | SAKI |
4 | |
5 | ジム |
この時、クエリとその抽出結果の組み合わせは、それぞれ以下のようになります。
SELECT
COUNT(*)
FROM
users
/* 抽出結果: 5 */
SELECT
COUNT(name)
FROM
users
/* 抽出結果: 4 */
上のクエリではCOUNT(*)を使っているため、レコードにNULLがあるか否かに関係なく、全てのレコードを数えます。
対して、下のクエリではCOUNT(name)
を使っており、nameカラムのNULLの値がカウントされません。
COUNT(カラム名)の使いどころ
二つの違いが分かったところで、恐らく皆さん、
COUNT(*)はよく聞くけど、COUNT(カラム名)を使う場面ってあるんかな~...
と思ってるかもなので、ここでは COUNT(カラム名)
の使いどころについて軽く触れたいと思います!
重複レコードがある時に、COUNT(DISTINCT カラム名) を使う
例えば、以下の二つのテーブルを使って、ユニーク登録ユーザー数とユニーク購入ユーザー数をカウントするとします。
id | name |
---|---|
1 | 太郎 |
2 | よしお |
3 | SAKI |
id | item | user_id |
---|---|---|
1 | 干し柿 | 1 |
2 | 干し柿 | 1 |
3 | 干し柿まんじゅう | 2 |
usersテーブルに対して、purchasesテーブルをLEFT OUTER JOIN
で結合すると、次のようなテーブルになります。
id | name | id | item | user_id |
---|---|---|---|---|
1 | 太郎 | 1 | 干し柿 | 1 |
1 | 太郎 | 2 | 干し柿 | 1 |
2 | よしお | 3 | 干し柿まんじゅう | 2 |
3 | SAKI |
usersテーブル側の id=1 のレコードが重複して作成されています。
この状態で、例えば登録者数をCOUNT(*)
で算出しようとすると、重複レコードが数えられて 4 が算出されてしまいます。
そこで、COUNT(DISTINCT カラム名)
の出番です!
SELECT
COUNT(DISTINCT u.id) AS user_count,
COUNT(DISTINCT p.user_id) AS purchase_user_count
FROM
users AS u
LEFT OUTER JOIN purchases AS p
ON u.id = p.user_id
登録者数については、COUNT関数の中身で、DISTINCT u.name
によってユーザー名をユニークな値のみに絞り、その数を数えています。
購入者数についても同様に、p.user_id
のユニークな値をカウントしています。
COUNT(*)
と COUNT(カラム名)
は、どちらも使い分けられるようになると、データ分析の効率がグッとUPするのでお勧めです!
ここまで読んでいただきありがとうございます!
また次の記事でお会いしましょう(^^)/