概要: このチュートリアルでは、MySQL の HAVING 句を使用して、行のグループや集約のフィルタ条件を指定する方法を学びます。

MySQL HAVING句の紹介

HAVINGSELECT ステートメントで、行や集約のグループに対するフィルタ条件を指定するために使用されます。

HAVINGGROUP BYGROUP BYHAVINGWHERE句と同様の動作をします。

以下にHAVING句の構文を示します:

SELECT select_listFROM table_nameWHERE search_conditionGROUP BY group_by_expressionHAVING group_condition;
Code language: SQL (Structured Query Language) (sql)

この構文では、HAVING句で条件を指定します。

HAVINGWHERE 句は個々の行にフィルタ条件を適用することに注意してください。

MySQLはHAVINGFROMWHERESELECTGROUP BYORDER BYLIMIT節の前です。

なお、標準SQLでは以下のように規定されています。 HAVINGSELECTGROUP BY節の後に評価されます。

MySQL HAVING句の例

ここでは、HAVINGorderdetailsテーブルを使用します。

以下では、GROUP BY句を使用して注文番号を取得しています。

orderdetails テーブルから注文番号、注文ごとの販売数、それぞれの売上合計を取得します。

SELECT ordernumber, SUM(quantityOrdered) AS itemsCount, SUM(priceeach*quantityOrdered) AS totalFROM orderdetailsGROUP BY ordernumber;
Code language: SQL (Structured Query Language) (sql)

試してみましょう

さて。 では、以下のようにHAVING1000よりも大きいかを調べることができます。

SELECT ordernumber, SUM(quantityOrdered) AS itemsCount, SUM(priceeach*quantityOrdered) AS totalFROM orderdetailsGROUP BY ordernumberHAVING total > 1000;
Code language: SQL (Structured Query Language) (sql)

試してみる

HAVINGORANDなどの論理演算子を使って、複雑な条件を構成することができます。

次の例では、HAVING1000600以上のアイテムを含む注文を検索します。

SELECT ordernumber, SUM(quantityOrdered) AS itemsCount, SUM(priceeach*quantityOrdered) AS totalFROM orderdetailsGROUP BY ordernumberHAVING total > 1000 AND itemsCount > 600;
Code language: SQL (Structured Query Language) (sql)

Try It Out

例えば、出荷済みのステータスで、合計金額が1500以上のすべての注文を検索したいとします。 orderdetailsordersINNER JOINstatustotal集約に条件を適用することができます。

SELECT a.ordernumber, status, SUM(priceeach*quantityOrdered) totalFROM orderdetails aINNER JOIN orders b ON b.ordernumber = a.ordernumberGROUP BY ordernumber, statusHAVING status = 'Shipped' AND total > 1500;
Code language: SQL (Structured Query Language) (sql)

Try It Out

HAVING

句は、GROUP BYHAVING句を使用して、今月、今四半期、または今年の総売上高が10Kを超える注文数を求めるような質問に答えることができます。

このチュートリアルでは、MySQL の HAVINGGROUP BY 句を使用して、行のグループや集約に対してフィルタ条件を指定する方法を学びました。

  • このチュートリアルは役に立ちましたか?
  • YesNo

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です