【MySQL】グループ化したデータにさらに条件を付ける~group by having~

MySQL

グループ化したデータにさらに条件を付け絞り込む方法について紹介していきます。

部長
部長

12月の売り上げで3000円以上の買い物をしている件数を抽出してほしいなあ

平社員
平社員

・・・・・。

前提条件

購入履歴を管理しているテーブルを使用します

使用するテーブル:ordersテーブル

+------+---------+--------+---------------------+
| id   | user_id | amount | order_time          |
+------+---------+--------+---------------------+
|    1 |       2 |   6000 | 2030-12-31 11:00:00 |
|    2 |       6 |   2000 | 2030-12-25 18:30:00 |
|    3 |       1 |   3000 | 2030-12-10 10:00:00 |
|    4 |       4 |   2500 | 2030-11-01 20:15:00 |
|    5 |       3 |   4000 | 2030-11-30 09:45:00 |
|    6 |       5 |   3600 | 2030-10-15 23:30:00 |
+------+---------+--------+---------------------+
6 rows in set (0.007 sec)

条件

  • 月ごとにデータを集
  • count集約関数を利用する
prefecture_idの値と都道府県名の紐づけ
  • 13   ⇒  東京都
  • 42  ⇒  長崎県
  • 11  ⇒  埼玉県
  • 10  ⇒  群馬県
  • 5  ⇒  秋田県

取得したデータの最大値を取得する

構文

select グループ化するカラム名,
count(*) from users 
group by グループ化するカラム名;

コードの見方

青文字・・・省略できない決まり文句
紫文字・・・コメント
白文字・・・利用者の任意で入力する文字列

使用するSQL文

select prefecture_id,
count(*) from users 
group by prefecture_id;

今回は都道府県ID別に計算するのでカラム名はprefecture_idを指定します。

prefecture_id別にユーザー数を研鑽するため、count集約関数を利用します。

出力結果

+---------------+----------+
| prefecture_id | count(*) |
+---------------+----------+
|             5 |        1 |
|            10 |        1 |
|            11 |        2 |
|            13 |        1 |
|            42 |        1 |
+---------------+----------+
5 rows in set (0.001 sec)

都道府県ID別に数を数えることができました。テーブルに登録しているユーザー数が少ないですが、埼玉県だけ二人のユーザーがいることがわかります。

COUNTで*(アスタリスク)を指定する意味

今回はカラム名の部分にアスタリスクを指定しました。実はカラム名を指定しても行数を数えることができます。

select count(name) from users where gender = 2;

出力結果

+-------------+
| count(name) |
+-------------+
|           3 |
+-------------+
1 row in set (0.001 sec)

前述したアスタリスクを使用した方法と同じ結果が出力されます。

カラム名と*(アスタリスク)の違い

カラム名を指定する場合とアスタリスクにする場合には多少の違いがあります。

カラム名を指定する

指定したカラムに値がない場合(Null)はカウントしない。

*(アスタリスク)を指定する

Nullのある行数もカウントする。

双方の違いを理解して使い分けましょう。

タイトルとURLをコピーしました