MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLでGROUP BYの結果にグループレベルのフィルタリング条件を適用する方法(HAVING句の使い方)

MySQLでは、SELECT文のGROUP BY句を使用することで、返される結果セットを特定の列の値に基づいてグループに分割できます。しかし、すべてのグループではなく、特定の条件を満たすグループだけを取得したい場合もあります。

このような場合は、GROUP BY句と組み合わせてHAVING句を使うことで、グループレベルでのフィルタリングが可能になります。WHERE句が個々の行に対して条件を適用するのに対し、HAVING句は集計後のグループに対して条件を適用する点が大きな特徴です。

HAVING句によるグループフィルタリングの例

例として、従業員情報を格納した「employees」テーブルを考えます。この中から、平均給与が55,000であるグループ(役職)だけを取得したいとします。その場合、HAVING句に以下のようなフィルタリング条件を指定します。

mysql> Select count(*),AVG(salary),Designation from employees GROUP BY designation having AVG(salary) = 55000;

+----------+-------------+-------------+
| count(*) | AVG(salary) | Designation |
+----------+-------------+-------------+
| 2        | 55000.0000  | Asst.Prof   |
+----------+-------------+-------------+

1 row in set (0.00 sec)

クエリの解説

  • GROUP BY designation:役職(Designation)ごとに行をグループ化します。
  • AVG(salary):各グループの平均給与を計算します。
  • HAVING AVG(salary) = 55000:平均給与が55,000と一致するグループのみを抽出します。

上記の実行結果からわかるように、「Asst.Prof(助教)」という役職のグループだけが返されています。このグループには2人の従業員が属しており、その平均給与は正確に55,000です。

WHERE句との違い

初心者が混乱しやすいポイントとして、WHERE句とHAVING句の違いがあります。

  • WHERE句:グループ化される前の個々の行に対して条件を適用します。集計関数(AVG、COUNTなど)は使用できません。
  • HAVING句:GROUP BYによって作成されたグループに対して条件を適用します。AVGやCOUNTなどの集計関数の結果を使った絞り込みが可能です。

つまり、集計結果をもとにグループを絞り込みたい場合は、必ずHAVING句を使用する必要があります。

  1. MySQLで結果セットを指定した順序どおりに取得する方法

    MySQLでIN句を使ってレコードを取得すると、通常はテーブル内の格納順どおりに結果が返されます。しかし、「指定した値の並び順どおりに結果セットを取得したい」というケースもあります。そんなときは、FIND_IN_SET()関数とORDER BY句を組み合わせることで簡単に実現できます。サンプルテーブルを作成するまず、動作確認用のテーブルを作成します。mysql> create table DemoTable1563 -> ( -> StudentId int, -> StudentName varchar(20) -> );Query OK

  2. MySQLでSELECTクエリの結果を並べ替える方法|ORDER BY句の基本と実践例

    データベース操作では、テーブルから特定のデータや行を抽出することが日常的によくあります。通常、SELECT文で取得した行はテーブル内に格納されている順序で返されますが、場合によっては、特定の列を基準にして昇順または降順で並べ替えた結果を取得したいこともあるでしょう。そんなときに活躍するのが「ORDER BY」句です。以下で具体的な使い方を見ていきましょう。例えば、「name」フィールドを含む複数のカラムを持つテーブルがあるとします。テーブルからすべての行を取得したいけれど、名前のアルファベット順に並べ替えた状態で結果を受け取りたい——こうしたケースでは、ORDER BY句を使って「name」フ