【譲】GROUP BYを理解したいならこの記事を読めば十分

GROUP BYを理解したいならこの記事を読めば十分です

Javaプログラマーの奮闘2020-12-22  09:38

 

序文

Group by キーワードは仕事でも面接でも頻繁に使われるため、理解しておく必要があります。group by を理解するには、集計関数、group by を組み合わせて説明する必要があります。

話す前に、テーブルを準備しましょう。

集計関数

group by について説明するには、まず集計関数を使用する必要があります。心配しないで、ステップごとに見ていきましょう。

集計機能とは「複数行のデータ」を計算後に「1行のデータ」に集計する機能です

一般的に使用される集計関数:

1.MAX:返回某列的最大值 
2.MIN(column)	返回某列的最高值 
3.COUNT(column)	返回某列的总行数 
4.COUNT(*)	返回表的总行数
5.SUM(column)	返回某列的相加总和
6.AVG(column)	返回某列的平均值

これらの集計関数を簡単に使用してみましょう。

  1. MAX 関数と MIN 関数

従業員テーブルの最高給与と最低給与を計算してみましょう。

emp から Max(sal) 、 Min(sal) を選択します。

  1. SUM 関数と AVG 関数

給与の合計と平均給与を計算してみましょう。

emp から sum(sal)、avg(sal) を選択します。

3. COUNT関数

count 関数は、行の総数を計算する関数です。count(*) はテーブル内の総行数を計算します。count (列名) は、列内の合計行数 (NULL 値を除く) を計算します。

emp から count(*),count(comm) を選択します。

注意深い友人なら気づいたかもしれませんが、count(*) と count(comm) の値が異なるのはなぜでしょうか。

答えは、NULL データは操作に参加しないため、集計関数は非 NULL データに対してのみ機能します。

集計関数を使用する場合は、このことに留意してください。そうしないと、計算結果が期待どおりにならない可能性があります。ボーナスの平均値を使用してテストを実行します。コードは次のとおりです。

emp から avg(comm),avg(ifnull(comm,0)) を選択します。

commで示される平均値も計算されるのに、計算値が異なるのはなぜですか?

上で、null は集計関数の計算に関与しないと述べました。それで:

avg(comm) は 4 人 (Guan Yu、Zhang Fei、Diao Chan、Wu Yong) のボーナスのみを計算し、平均を取りました。

ただし、avg(ifnull(comm,0)) は全員のボーナスを計算し、平均値をとります。したがって、値ははるかに小さくなり、重要なのは ifnull() 関数を使用することです (ifnull 関数の機能は、値が null であることが判明した後に値を 0 に変更することです)。

注意: 集計関数を使用するときは null 値に注意し、ifnull 関数と一緒に使用してください~

ここで、select count(*), count(comm) from emp; というステートメントを振り返ってみましょう。より明確になっているでしょうか?

さて、集計関数についてはここで終わりますが、実際はそれほど難しくありませんね。まずはグループ化から始めましょう。

グループ化

GROUP BY ステートメントは、結果セットを 1 つ以上の列ごとにグループ化します。通常、グループ化された列では COUNT、SUM、AVG などの関数を一緒に使用します。

誰でも見やすくするために、従業員テーブルをここに持ってきました。まずジョブのグループで実行しましょう。

ジョブごとに emp グループからジョブ ,group_concat(ename) を選択します。

職種ごとのグループ化がないことが確認できたら、職種ごとに自動的に分類していきます。group_concat 関数は、分類された名前をカンマで区切って文字列に連結する関数です。この関数だけで十分に理解できます。私は、それをもっとわかりやすくするためにここにいます。

以下にそのような要件があります。

求每个部门所有工资总和。

簡単な文では、where だけを使うのは難しいです。しかし、グループ化は非常に簡単です。コードは以下のように表示されます。

select deptno,sum(sal) from emp group by  deptno;

テーブル データを deptno フィールドでグループ化した後、sum(sal) によって各グループの合計を計算します。

別の難しい演習を行ってみましょう。各部門で給与が 1500 を超える人の数をクエリします。

これは難しいですか?少し分割してみましょう。

1.每个部门:按照deptno分组,
   select deptno from emp group by deptno;
2.工资大于1500:where sal >1500
3.人数:count(*)函数。

このような分割をより明確にするには、次のステートメントを書きます。

select deptno,count(*) from emp where sal >1500 group by deptno;

さて、グループ化についてはこれで終わりです。次は、持つことについて話しましょう。

持っている

HAVING はグループ化後の再審査に使用され、グループ化のみに使用できます。(注: グループ化後)

演習: 給与合計が 9000 を超える部門を検索し、給与合計で並べ替えます。

この質問は上記からの続きです。「各部門のすべての賃金の合計を求めてください」と、グループ化後のフィルターが追加されています。SQL ステートメントは次のとおりです。

select deptno,sum(sal)  total  from emp group by  deptno having sum(sal) >9000 
order by sum(sal) asc;

have と where の違い:

   1.having是分组后,where是分组前
   2.where不用使用聚合函数,having可以使用聚合函数。
   3.where在分组之前就会进行筛选,过滤掉的数据不会进入分组。

キーワードの実行順序のまとめ

キーワードの記述順序は次のとおりです。

		1.select 
		2.from
		3.where
		4.group by
		5.having
		6.order by
		7. limit

キーワードの実行順序は次のとおりです。

    1.from	//行过滤
		2.where
		3.group by
		4.having
		5.select	//列过滤
		6.order by//排序
		7.limit//附加

引き続き従業員テーブルを例として、次のステートメントを例として、ステップごとに分析してみましょう。

select deptno,sum(sal)  total  from emp where sal>1000 group by  deptno having sum(sal) >9000 
order by sum(sal) asc;

結果は次のとおりです。

ステップ 1: from キーワードを実行する

等同于执行语句:select *  from emp;

第 2 ステップ: 第 1 ステップに基づいてどこを実行するか

等同于:select deptno from emp where sal >1000;

3 番目のステップ: 2 番目のステップに基づいて group by を実行する

等同于:select deptno from emp where sal >1000 group by deptno;

ステップ4: ステップ3に基づいてhavingを実行する

等同于:select deptno from emp where sal >1000 group by deptno having sum(sal) >9000;

ステップ 5: 3 番目のステップに基づいて列を選択します。

等同于:select deptno,sum(sal)  total from emp where sal >1000 
group by deptno having sum(sal) >9000;

ステップ6:並べ替えて注文する(省略)

ステップ7:制限(省略)

終わり

さて、この章はここまでです。

編集者は今後も高品質なコンテンツを出力していきますので、フォローしていただきありがとうございます。

おすすめ

転載: blog.csdn.net/jessezappy/article/details/131189750