mysql フィルターのグループ化
group by を使用してデータをグループ化することに加えて、MySQL ではグループをフィルター処理して、どのグループを含めるか、どのグループを除外するかを指定することもできます。たとえば、少なくとも 2 件の注文があるすべての顧客をリストすることができます。このデータを取得するには、個人ではなく完全なグループに基づいてフィルタリングを実行する必要があります。
where 句が実際に動作していることはすでに見てきました。ただし、where フィルターはグループではなく行を指定しているため、この例では where はタスクを実行しません。実際、where にはグループ化の概念がありません。
では、どこで使用しない場合は何を使用するのでしょうか? MySQL は、この目的のために別の句、having 句を提供します。 「have」は「where」と非常によく似ています。実際、これまでに学習したすべての種類の where 句は、have に置き換えることができます。唯一の違いは、フィルター グループがある一方で行をフィルターする場所です。
注: はすべての where 演算子をサポートします。
では、グループをフィルタリングするにはどうすればよいでしょうか?次の例を見てください:
入力:
select cust_id,count(*) as orders from orders group by cust_id having count(*) >= 2;
出力:
分析: この select ステートメントの最初の 3 行は、上記のステートメントと似ています。最後の行は、count(*>)>=2 (3 つ以上の順序) でグループをフィルタリングする Having 句を追加します。
ご覧のとおり、フィルタリングは特定の行の値ではなく、グループ化された集計値に基づいているため、ここでは where 句は機能しません。
having と where の違い: これを理解する別の方法として、データをグループ化する前に where フィルターを使用し、データをグループ化した後にフィルターを使用するというものがあります。これは重要な違いであり、where によって除外された行はグループ化に含まれません。これにより、計算値が変更される可能性があり、その結果、これらの値に基づいてフィルターで除外される Having 句内のグループ化に影響を与える可能性があります。
それでは、1 つのステートメントで where 句と Having 句の両方を使用する必要があるのでしょうか?実際、あります。過去 12 か月間に 2 人以上の顧客が返されるように、上記のステートメントをさらにフィルタリングするとします。これを実現するには、Where 句を追加して 12 か月以内に行われた注文を除外します。次に、having 句を追加して、3 つ以上の順序を持つグループを除外します。
よりよく理解するために、2 (両端を含む) を超える製品と 10 (両端を含む) 以上の価格を持つサプライヤーをリストする以下の例を見てください。このステートメントの最初の行は、前の例とよく似た集計関数を使用した基本的な SELECT です。 WHERE 句は、prod_price が 10 以上であるすべての
行をフィルターします。データは、vend_id によってグループ化され、HAVING 句によってカウントが 2 以上のグループがフィルタリングされます。
WHERE 句がない場合は、さらに 2 行が取得されます (サプライヤー 1002、が販売するすべての製品の価格は 10 未満です。サプライヤー 1001、3 製品を販売しましたが、1 つの製品だけが 10 に等しいより高い価格
を持っています) ):入力: count(*) >=2を持つvend_idによる製品グループからのnum_prodsとしてvend_id,count(*)を選択します。出力:
【関連する推奨事項】
mysqlデータのグループ化とソート、および SELECT 句の順序
mysql データのグループ化: グループ化の作成以上がmysql データのグループ化: フィルターのグループ化の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。