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) 返回某列的平均值
これらの集計関数を簡単に使用してみましょう。
-
MAX 関数と MIN 関数
従業員テーブルの最高給与と最低給与を計算してみましょう。
emp から Max(sal) 、 Min(sal) を選択します。
-
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:制限(省略)
終わり
さて、この章はここまでです。
編集者は今後も高品質なコンテンツを出力していきますので、フォローしていただきありがとうございます。