SQL GROUP BY 句と HAVING 句の例

SQL Group by Clauseとは何ですか?

GROUP BY 句は、次の目的で使用される SQL コマンドです。 同じ値を持つ行をグループ化する。 GROUP BY 句は SELECT ステートメントで使用されます。 オプションで、データベースから概要レポートを作成するために集計関数と組み合わせて使用​​されます。

それがやることなのですが、 データの要約 データベースから。

GROUP BY 句を含むクエリはグループ化クエリと呼ばれ、グループ化された項目ごとに XNUMX つの行のみを返します。

SQL GROUP BY 構文

SQL GROUP BY 句が何であるかがわかったので、基本的な group by クエリの構文を見てみましょう。

SELECT statements... GROUP BY column_name1[,column_name2,...] [HAVING condition];

こちら

  • 「SELECT ステートメント…」は標準 SQL SELECT コマンド クエリです。
  • グループ化 列名1” は、column_name1 に基づいてグループ化を実行する句です。
  • 「[,column_name2,…]」はオプションです。 は、複数の列でグループ化が行われる場合の他の列名を表します。
  • 「[HAVING 条件]」はオプションです。 これは、GROUP BY 句の影響を受ける行を制限するために使用されます。 それは、 WHERE句.

を使用してグループ化する 単一列

SQL Group By 句の効果を理解しやすくするために、members テーブルからすべての性別エントリを返す単純なクエリを実行してみましょう。

SELECT `gender` FROM `members` ;
gender
Female
Female
Male
Female
Male
Male
Male
Male
Male

性別の一意の値を取得したいとします。次のクエリを使用できます。

SELECT `gender` FROM `members` GROUP BY `gender`;

上記のスクリプトを実行すると、 MySQL 作業台 Myflixdb に対して実行すると、次の結果が得られます。

gender
Female
Male

XNUMX つの結果のみが返されたことに注意してください。 これは、性別タイプが男性と女性の XNUMX つしかないためです。 SQL の GROUP BY 句は、すべての「男性」メンバーをグループ化し、そのメンバーに対して XNUMX 行のみを返しました。 「女性」メンバーも同様でした。

を使用してグループ化する 複数列

映画 category_id と対応する公開年のリストを取得したいとします。

この単純なクエリの出力を観察してみましょう

SELECT `category_id`,`year_released` FROM `movies` ;
category_id year_released
1 2011
2 2008
NULL 2008
NULL 2010
8 2007
6 2007
6 2007
8 2005
NULL 2012
7 1920
8 NULL
8 1920

上記の結果には多くの重複があります。

SQL で group by を使用して同じクエリを実行してみましょう –

SELECT `category_id`,`year_released` FROM `movies` GROUP BY `category_id`,`year_released`;

上記のスクリプトを実行すると、 MySQL myflixdb に対する workbench の結果は、以下に示すとおりです。

category_id year_released
NULL 2008
NULL 2010
NULL 2012
1 2011
2 2008
6 2007
7 1920
8 1920
8 2005
8 2007

GROUP BY句は、カテゴリIDとリリース年の両方を操作して、 ユニーク 上の例の行。

カテゴリ ID が同じでもリリース年が異なる場合、行は一意の行として扱われます。カテゴリ ID とリリース年が複数の行で同じである場合、その行は重複し、XNUMX 行のみとみなされます。示されています。

グループ化と 集計関数

データベース内の男性と女性の総数を取得したいとします。そのためには、以下のスクリプトを使用できます。

SELECT `gender`,COUNT(`membership_number`)  FROM `members` GROUP BY `gender`;

上記のスクリプトを実行すると、 MySQL myflixdb に対する workbench の結果は次のようになります。

gender COUNT('membership_number')
Female 3
Male 5

以下に示す結果は、投稿されたすべての一意の性別値ごとにグループ化され、グループ化された行の数は COUNT 集計関数を使用してカウントされます。

を使用してクエリ結果を制限する HAVING

特定のテーブル内のすべてのデータに対してグループ化を実行する必要があるとは限りません。 結果を特定の基準に制限したい場合があります。 このような場合には、HAVING 句を使用できます。

映画カテゴリ ID 8 のすべての公開年を知りたいとします。結果を得るには、次のスクリプトを使用します。

SELECT * FROM `movies` GROUP BY `category_id`,`year_released` HAVING `category_id` = 8;

上記のスクリプトを実行すると、 MySQL Myflixdb に対するワークベンチの結果は、以下に示すとおりです。

movie_id title director year_released category_id
9 Honey mooners John Schultz 2005 8
5 Daddy's Little Girls NULL 2007 8

カテゴリ ID が 8 の映画のみが GROUP BY 句の影響を受けることに注意してください。

まとめ

  • GROUP BY 句 SQL は、同じ値を持つ行をグループ化するために使用されます。
  • GROUP BY 句は、 SQL SELECT ステートメント.
  • GROUP BY 句で使用される SELECT ステートメントには、列名、集計関数、定数、および式が含まれる場合のみ使用できます。
  • SQL Have 句は、GROUP BY 句によって返される結果を制限するために使用されます。
  • MYSQL GROUP BY 句は、複数のレコードからデータを収集し、1 つ以上の列でレコード セットを返すために使用されます。