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 ページの応答速度を最適化します。

推薦する

CSSフィルターにはどんな魔法の用途があるか

背景基本概念CSS filterプロパティは、ぼかしや色の変化などのグラフィック効果を要素に適用して...

MySQL 8.0.15 のインストールと設定方法のグラフィック チュートリアル (Windows 10 X64)

最近私が学んでいるのは MySQL の知識なので、MySQL をインストールすることが非常に重要です...

HTMLデザインパターンの日々の勉強ノート

HTML デザインパターン学習ノート今週は主にHTMLデザインパターンを学びました。学習内容をまとめ...

HTML でシンプルな ListViews 効果を実装するためのサンプル コード

シンプルなリストビュー効果を実現するHTML結果: CSS スタイル ファイル listviewTe...

JS の new 関数の詳細な説明

目次1. 例2. 兵士100人を作成する3. 質問4. 改善点5. エレガント? 6. JSの父から...

Ubuntu 14 に Nginx-RTMP ストリーミング サーバーをインストールするチュートリアル

1. RTMP RTMP ストリーミング プロトコルは、Adobe が開発したリアルタイムのオーディ...

フォームの「Enter」、「Submit」、「Enter != Submit」を削除する方法

「Enter != Submit」問題を実装するには、通常、「ボタンの種類」と「入力ボックスの数」か...

NodeJs の高メモリ使用量のトラブルシューティング実戦記録

序文これは、オンライン コンテナーの拡張によって発生した調査です。最終的には、実際の OOM が原因...

Nginxはドメイン名のアクセス方法を定義しています

最近Nginxを構築しているのですが、ドメイン名でアクセスできません。 nginx 構成ファイル n...

Dockerを使用してNextCloudネットワークディスクを展開する方法

NextCloud コンピュータ上の任意のファイルやフォルダを共有し、NextCloud サーバーと...

WeChat 8.0の爆発的な特殊効果を実現するために300行以上のCSSコードが必要

WeChat 8.0 アップデートの主な特徴は、アニメーション絵文字のサポートです。送信するメッセー...

Nexus を使用して jar パッケージをプライベート サーバーに追加する方法

なぜ Nexus プライベート サーバーを構築する必要があるのでしょうか。その理由は非常に簡単です。...

MySQL 接続で認証失敗エラーが発生する場合の分析と解決方法

[問題の説明]アプリケーション側では、次のエラーが時々表示されます。メソッド 'mysql_...

マウスを動かしたときにセカンダリメニューバーを実装するために HTML+CSS を使用する例

この記事では、マウスを動かしたときにセカンダリ メニュー バーを実装するために HTML+CSS を...