SQL文におけるGROUP BYとHAVINGの使用に関する簡単な説明

SQL文におけるGROUP BYとHAVINGの使用に関する簡単な説明

GROUP BY 句と HAVING 句を紹介する前に、まず SQL 言語の特殊な関数である集計関数について説明する必要があります。

たとえば、SUM、COUNT、MAX、AVG などです。これらの関数と他の関数との基本的な違いは、通常、複数のレコードに対して作用することです。

bbcからSUM(人口)を選択

ここでの SUM は、返されるすべてのレコードの人口フィールドに適用され、クエリはすべての国の合計人口という 1 つの結果のみを返します。

グループ化後のスクリーニング条件であり、グループ化されたデータはグループ内でさらにスクリーニングされる。
グループ化する前にフィルタリングする場所

GROUP BY 句を使用すると、SUM や COUNT などの関数をグループに属するデータに対して実行できます。

GROUP BY region を指定すると、同じ地域に属するデータのグループは 1 行の値のみを返します。

つまり、地域を除くテーブル内のすべてのフィールドは、SUM や COUNT などの集計関数によって計算された値のみを返すことができます。

HAVING 句を使用すると、データ グループをフィルターできます。

WHERE 句は、集計前にレコードをフィルタリングします。つまり、GROUP BY 句と HAVING 句の前で機能します。

HAVING 句は、集計後にグループ レコードをフィルターします。

具体的な例を通して GROUP BY 句と HAVING 句を理解し、セクション 3 で紹介した bbc テーブルを使用します。

SQLの例:

1.各地域の総人口と総面積を表示します。

地域、SUM(人口)、SUM(面積) を選択
BBCより
地域別にグループ化

まず、region を使用して、返されたレコードを複数のグループに分割します。これが GROUP BY の文字通りの意味です。グループが形成された後、集計関数を使用して、各グループ (1 つ以上のレコード) 内の異なるフィールドを操作します。

2. 各地域の総人口と総面積を表示します。面積が 1,000,000 を超える地域のみが表示されます。

地域、SUM(人口)、SUM(面積) を選択

bbc8 F4 w2 v( P- f から
地域別にグループ化
合計(面積)>1000000#

ここでは、そのようなレコードがテーブルに存在しないため、where を使用して 1,000,000 を超える地域をフィルターすることはできません。
逆に、HAVING 句を使用すると、グループ化後にデータ グループをフィルター処理できます。

3. CUSTOMERテーブルとORDERテーブルでユーザーの注文数を照会する

c.name を選択し、count(order_number) を count として、orders o、customer c から、c.id=o.customer_id で、customer_id でグループ化します。
+--------+-------+
| 名前 | カウント |
+--------+-------+
| 日 | 9 |
| cc | 6 |
| 菩提樹の種子 | 1 |
| cccccc | 2 |
+--------+-------+

HAVINGフィルターを追加

c.id=o.customer_id で、count(order_number)>5 を持つ customer_id でグループ化し、orders o、customer c から c.name、count(order_number) を count として選択します。
+------+-------+
| 名前 | カウント |
+------+-------+
| 日 | 9 |
| cc | 6 |
+------+-------+

4. さらにいくつか例を挙げます

SQL> scから*を選択します。

 SNO PNOグレード
---------- ----- ----------
  1 ヤング 95
  1 SX98
  1 YY 90
  2 ヤング89
  2 SX91
  2 西暦92年
  3 ヤング85
  3 SX88
  3 西暦96年
  4 ヤング 95
  4 SX89

 SNO PNOグレード
---------- ----- ----------
  4 88年

この表には、SNO (学生番号)、PNO (コース名)、GRADE (成績) など、各科目の 4 人の学生の学業成績の記録が記載されています。

1. 90点以上の学生のコース名とスコアを表示する

//これは単純なクエリであり、グループ化クエリは使用しません

SQL> grade>=90 の場合、sc から sno、pno、grade を選択します。
 SNO PNOグレード
---------- ----- ----------
  1 ヤング 95
  1 SX98
  1 YY 90
  2 SX91
  2 西暦92年
  3 西暦96年
  4 ヤング 95

7 行が選択されました。

2. 各生徒の得点が90点を超える科目の数を表示する

//グループで表示し、where 条件に従ってカウントします。SQL> select sno,count(*) from sc where grade>=90 group by sno;
 SNOカウント(*)
---------- ----------
  1 3
  22
  4 1
  3 1

3. ここでは having ステートメントを使用しませんでした。次に、優秀な学生を 3 人選びたい場合、対象となるには少なくとも 2 つのコースが 90 点を超えている必要があります。対象となる学生の数と 90 点を超えるコースの数をリストします。

// グループで表示し、where 条件に従ってカウントし、having 句に従ってグループをフィルター処理します。SQL> select sno,count(*) from sc where grade>=90 group by sno having count(*)>=2;
 SNOカウント(*)
---------- ----------
  1 3
  22

この結果が、私たちが求めているものです。「3 人の優秀な学生」賞の対象となる学生番号がリストされています。前の例と比較すると、これはグループ化後に実行されたサブクエリであることがわかります。

4. 学校では上級生を選抜しています。平均点が90点以上の学生が対象で、中国語コースの点数は95点以上である必要があります。対象学生をリストアップしてください。

// 実際、このクエリは、最初に中国語のスコアが 95 を超える学生番号を抽出し、平均を計算し、グループ化後の having ステートメントに従って平均スコアが 90 を超える学生を選択します。SQL> select sno,avg(grade) from sc where SNO IN (SELECT SNO FROM SC WHERE GRADE>=95 AND PNO='YW') group by sno having avg(grade)>=90;
 SNO AVG(グレード)
---------- ----------
  1 94.3333333
  4 90.6666667

5. 平均点が学生ID 3の平均点以上である学生の学生IDと平均点を照会する

//比較とサブクエリは、having 句で実行できます。SQL> select sno,avg(grade) from sc
 sno によるグループ
 avg(grade) > (select avg(grade) from sc where sno=3) である。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • サンプルコードを持つMySQLグループ
  • MySQL で GROUP BY を使用せずに HAVING ステートメントを直接使用する問題の調査
  • MySQL での group by と having together の使用に関する注意事項
  • MySQL の order by、group by、having の違いを詳細に分析します。

<<:  Linux のプロセスクラッシュの原因をコアダンプ技術を使用して追跡する簡単な分析

>>:  Vue プロジェクトのパッケージ化、マージ、圧縮により、Web ページの応答速度を最適化します。

推薦する

Nginx フォワード プロキシとリバース プロキシ、および負荷分散機能の構成コード例

この記事は主に、Nginx のフォワード プロキシとリバース プロキシ、および負荷分散機能の設定コー...

ログインインターセプションを実装するためのVueルーティング

目次1. 概要2. ログインインターセプションを実装するためのルーティングナビゲーションガード1. ...

MYSQL サブクエリとネストされたクエリの最適化例の分析

ゲーム史上最高スコアトップ100をチェックSQLコード cdb_playsgame ps から ps...

色の16進数カラーコード表表示と16進値の比較表示で簡単に検索できます

さまざまな色の16進コード表[パート1] 赤とピンク、およびそれらの 16 進コード。 #99003...

v-model 双方向バインディングデータを実装する vue カスタム コンポーネントのサンプル コード

プロジェクトでは、プロジェクトが呼び出すカスタム パブリック コンポーネントに遭遇します。通常、pr...

vuexプロジェクトにおけるログインステータス管理の実践プロセス

目次道具:ログインシナリオ:練習する:シナリオ1: 思考と実践シナリオ2: 思考と実践要約する道具:...

docker compose を使用してハーバープライベートウェアハウスをインストールする詳細なチュートリアル

概要港とは何ですか?英語の単語の意味は「港」です。 Harborはコンテナ(貨物)を保管するために使...

この記事では、イベント委任を使用してJavaScriptメッセージボード機能を実装する方法について説明します。

イベント委任を使用してメッセージ ボード機能を実装します。 <!DOCTYPE html>...

jquery+springbootでファイルアップロード機能を実現

この記事の例では、ファイルアップロード機能を実現するためのjquery+springbootの具体的...

JavaScript BOM の説明

目次1. BOMの紹介1. JavaScriptは3つの部分から構成される2.ウィンドウオブジェクト...

Windows 10 でカスタムドメイン名をバインドするように Hexo と GitHub を構成する方法

Hexo は Windows 10 でカスタムドメイン名を GitHub にバインドしますまずドメイ...

Mac インストール mysqlclient プロセス分析

仮想環境で pip 経由でインストールしてみてください: pip で mysqlclient をイン...

Centos Docker ブリッジ モードでホスト Redis サービスにアクセスできないというトラブルシューティングの経験

背景:以前、コンテナ内のホストが提供する Redis サービスにアクセスする必要があるプロジェクトを...

CentOS7 のシステム サービスに Nginx を追加する方法

導入コンパイル、インストール、問題の解決後、Nginx は正常に動作していますが、現時点では Ngi...

WeChatアプレットがフォーム検証を実装

WeChatアプレットフォームの検証、参考までに具体的な内容は次のとおりです。プラグインWxVali...