概要: このチュートリアルでは、MySQL の HAVING 句を使用して、行のグループや集約のフィルタ条件を指定する方法を学びます。
MySQL HAVING句の紹介
HAVINGSELECT ステートメントで、行や集約のグループに対するフィルタ条件を指定するために使用されます。
HAVINGGROUP BYGROUP BYHAVINGWHERE句と同様の動作をします。
以下にHAVING句の構文を示します:
Code language: SQL (Structured Query Language) (sql)SELECT select_listFROM table_nameWHERE search_conditionGROUP BY group_by_expressionHAVING group_condition;
この構文では、HAVING句で条件を指定します。
HAVINGWHERE 句は個々の行にフィルタ条件を適用することに注意してください。
MySQLはHAVINGFROMWHERESELECTGROUP BYORDER BYLIMIT節の前です。
HAVINGSELECTGROUP BY節の後に評価されます。MySQL HAVING句の例
ここでは、HAVINGorderdetailsテーブルを使用します。
以下では、GROUP BY句を使用して注文番号を取得しています。
orderdetails テーブルから注文番号、注文ごとの販売数、それぞれの売上合計を取得します。
Code language: SQL (Structured Query Language) (sql)SELECT ordernumber, SUM(quantityOrdered) AS itemsCount, SUM(priceeach*quantityOrdered) AS totalFROM orderdetailsGROUP BY ordernumber;
試してみましょう
さて。 では、以下のようにHAVING1000よりも大きいかを調べることができます。
Code language: SQL (Structured Query Language) (sql)SELECT ordernumber, SUM(quantityOrdered) AS itemsCount, SUM(priceeach*quantityOrdered) AS totalFROM orderdetailsGROUP BY ordernumberHAVING total > 1000;
試してみる
HAVINGORANDなどの論理演算子を使って、複雑な条件を構成することができます。
次の例では、HAVING1000600以上のアイテムを含む注文を検索します。
Code language: SQL (Structured Query Language) (sql)SELECT ordernumber, SUM(quantityOrdered) AS itemsCount, SUM(priceeach*quantityOrdered) AS totalFROM orderdetailsGROUP BY ordernumberHAVING total > 1000 AND itemsCount > 600;
Try It Out
例えば、出荷済みのステータスで、合計金額が1500以上のすべての注文を検索したいとします。 orderdetailsordersINNER JOINstatustotal集約に条件を適用することができます。
Code language: SQL (Structured Query Language) (sql)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;
Try It Out
句は、GROUP BYHAVING句を使用して、今月、今四半期、または今年の総売上高が10Kを超える注文数を求めるような質問に答えることができます。
このチュートリアルでは、MySQL の HAVINGGROUP BY 句を使用して、行のグループや集約に対してフィルタ条件を指定する方法を学びました。
- このチュートリアルは役に立ちましたか?
- YesNo