MySQLのWHERE句でSUM()関数の結果は使用できる?HAVING句を使った正しい書き方を解説
MySQLでは、SUM()などの集計関数の結果をWHERE句で直接使用することはできません。これは、WHERE句がグループ化の前に行単位で評価されるためです。代わりに、GROUP BYと組み合わせたHAVING句を使うことで、集計結果に基づいた絞り込みが可能になります。
ここからは、実際にサンプルテーブルを作成しながら手順を確認していきましょう。
1. サンプルテーブルの作成
まず、名前と価格を持つテーブルを作成します。
mysql> create table DemoTable
(
Name varchar(50),
Price int
);
Query OK, 0 rows affected (0.79 sec)
2. レコードの挿入
INSERT文を使ってテストデータを登録します。
mysql> insert into DemoTable values('Chris',30);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values('David',40);
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable values('Chris',10);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('Mike',44);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values('David',5);
Query OK, 1 row affected (0.17 sec)
3. テーブルの中身を確認する
SELECT文ですべてのレコードを表示してみます。
mysql> select * from DemoTable;
実行すると、次のような結果が得られます。
+-------+-------+ | Name | Price | +-------+-------+ | Chris | 30 | | David | 40 | | Chris | 10 | | Mike | 44 | | David | 5 | +-------+-------+ 5 rows in set (0.00 sec)
4. HAVING句でSUM()の結果を条件にする
SUM()関数の結果(合計金額)をもとに絞り込みを行うには、次のようにHAVING句を記述します。
mysql> select Name,SUM(Price) AS Total_Price from DemoTable group by Name having Total_Price > 40;
実行結果は以下の通りです。
+-------+-------------+ | Name | Total_Price | +-------+-------------+ | David | 45 | | Mike | 44 | +-------+-------------+ 2 rows in set (0.03 sec)
クエリの解説
このクエリでは、Nameカラムでグループ化し、各グループの合計金額をTotal_Priceとして計算しています。HAVING句の条件「Total_Price > 40」によって、合計が40より大きいグループのみが抽出されました。
- David:40 + 5 = 45 → 抽出される
- Mike:44 → 抽出される
- Chris:30 + 10 = 40 → 条件を満たさないため除外
WHERE句とHAVING句の違い
WHERE句は行単位のフィルタリングを行い、GROUP BYや集計関数が処理される前に実行されます。そのため、SUM()のような集計関数を条件に含めることはできません。
一方、HAVING句はGROUP BYによるグループ化の後に評価されるため、SUM()やCOUNT()、AVG()などの集計結果に対する条件指定に最適です。「集計結果で絞り込みたい」ときはHAVING句を使う、と覚えておくとよいでしょう。
-
MySQLでSUM()とIF()を組み合わせて条件付き集計を行う方法
はい、MySQLではSUM()とIF()を組み合わせて使用できます。この2つを併用すると、「特定の条件に一致する値だけを数える」「条件ごとに集計する」といった柔軟な処理が可能になります。ここでは、実際にデモテーブルを作成しながら、その使い方を順番に見ていきましょう。 1. デモテーブルを作成する まず、動作確認用のサンプルテーブルを作成します。 mysql> create table DemoTable ( Value int, Value2 int ); Query OK, 0 rows affected (0.51 sec) 2. テーブルにデータを挿入する I
-
MySQLのCASE WHENステートメントで条件に応じた値を取得する方法
MySQLでは、CASE WHEN ステートメントを使用することで、特定の条件が満たされた場合にのみ別の列の値を返し、それ以外の場合は元の列の値を出力するといった柔軟な条件分岐処理を実現できます。本記事では、具体的な手順を通してその使い方を解説します。 1. サンプルテーブルの作成 まず、以下のCREATE TABLE文でテーブルを作成します。 mysql> create table DemoTable1040 ( Value1 int, Value2 int, Value3 int ); Query OK, 0 rows affected (0.65 sec)