ホームページ  >  記事  >  データベース  >  mysqlでグループ化して合計する方法

mysqlでグループ化して合計する方法

WBOY
WBOYオリジナル
2022-03-09 16:15:5219673ブラウズ

mysql では、SUM() 関数と「GROUP BY」を指定した SELECT ステートメントを使用してグループの合計を実行できます。構文は「SELECT クエリ フィールド SUM (合計フィールド) AS フィールド FROM テーブル名 WHERE 条件」です。 GROUP BY フィールド 1 をグループ化し、フィールド 2 をグループ化します。".

mysqlでグループ化して合計する方法

このチュートリアルの動作環境: Windows10 システム、mysql8.0.22 バージョン、Dell G3 コンピューター。

mysql でグループ合計を実行する方法

mysql では、

SELECT 查询字段 SUM(求和字段) AS 字段 FROM 表名 WHERE 条件 GROUP BY 分组字段一,分组字段二;

を使用してグループ合計を実行できます。

例は次のとおりです。

1) count() は、特定の列の行数を検索します。

count は理解しやすいです。 (列名) は、特定の列の行数を調べるための列の行数です。この列では null 値を持つ行の数はカウントされないことに注意してください。例:

>-- 教師が何人いるかをクエリします。

mysqlでグループ化して合計する方法

>-- Teacher テーブルにある行数をクエリします。 SELECT COUNT(*) FROM Teacher;

mysqlでグループ化して合計する方法

列に重複する値がある場合、 をカウントしますが、重複する値はカウントしたくありません## #、 私たちは何をすべきか?解決するには、distinct を使用できます。

-- 查询成绩表里共有几个学生的成绩
SELECT COUNT(DISTINCT 学号) FROM score;

mysqlでグループ化して合計する方法

2) sum() は、データの特定の列

sum を合計します。列内の値を合計するには、数値のみを計算できます。例:

--  对所有成绩求和
SELECT SUM(成绩) FROM score;

mysqlでグループ化して合計する方法

3) avg() は特定の列の値を平均します

同様に、平均は計算される 数値を計算する:

-- 对所有成绩求平均值
SELECT AVG(成绩) FROM score;

mysqlでグループ化して合計する方法

##4) max() は特定のデータ列の最大値を検索し、min() は特定のデータ列の最小値を検索します。データ列

-- 获取所有成绩中的最大成绩
SELECT MAX(成绩),MIN(成绩) FROM score;

mysqlでグループ化して合計する方法

グループ

質問では、各科目の平均スコアを知る必要があると述べました。それをグループ化します。

SQL では、group by ステートメントを使用して、1 つ以上の列に従って結果セットをグループ化できます。例:

mysqlでグループ化して合計する方法

-- 计算每一科课程的平均成绩
SELECT 课程号,AVG(成绩) FROM score GROUP BY 课程号;

mysqlでグループ化して合計する方法

前回の記事では、どのテーブルが最初に実行されるかという SQL ステートメントの実行順序について簡単に紹介しました。 データを取得します。次に、select ステートメントを実行します。


ここでは、

スコア テーブルからデータを取得し、group by ステートメントを使用して特定のルールに従ってデータをグループ化します。結果に対して count() を計算するグループで、最後に結合された結果を選択し、前のステップの計算結果の各セットをテーブル に要約します。

グループ化条件の条件を指定します

最初の問題では、「各科目の平均点を計算し、その平均点が80点以上になるようにする」ことが求められています。上の 2 つのセクションでは、毎日の科目の平均スコアを計算しました。次に、平均スコアの条件

: 「80 点以上」 を指定します。 を使用します。句を持つ。

mysqlでグループ化して合計する方法

have 句と where 句はどちらもデータの条件付き選択です。違いは、where を summary 関数で使用できないことです。

-- 计算平均成绩大于等于80分的课程;
SELECT 课程号,AVG(成绩) FROM score GROUP BY 课程号 HAVING AVG(成绩)>=80;
それは、have 句の順序も選択結果の概要の前にあるという意味ですか?はい、having 句は、80 以上のスコアを必要とするなど、group by のグループ化結果の条件を指定します。結果をフィルタリングした後、結果が要約されます。

mysqlでグループ化して合計する方法

-- 对教师表根据教师姓名排序
SELECT * FROM teacher ORDER BY 教师姓名;

mysqlでグループ化して合計する方法

NULL 値 Null が最初にランク付けされることがわかりました。したがって、次のようになります。

NULL 値を含む列は、次の場合にソートされます。ソートすると、NULL 値が先頭になります。 データ量が多く、NULL 値を確認したい場合は、このソートを使用できます。

另外,在补充一个limit语句从查询结果中取出指定行,比如,我们如果从刚才的查询结果中只取第一行:

-- 计算平均成绩大于等于80分的课程并根据成绩降序排,并获取第一行
SELECT 课程号,AVG(成绩) FROM score GROUP BY 课程号 HAVING AVG(成绩)>=80 ORDER BY AVG(成绩) DESC LIMIT 1;

mysqlでグループ化して合計する方法

接下来我们进行一个总结。

用SQL解决业务问题分析思路

简单来说:明确问题,将问题翻译成大白话,逐步进行拆解,并写出分析思路和对应的SQL思路。

1) 明确问题,将问题翻译成大白话:

“计算各科的平均成绩并且得出平均成绩大于等于80分的课程并降序排列”翻译成大白话就是:

“计算每一门课程平均成绩,然后根据得出的结果,进行大于等于80分的条件查询,对查询结果进行降序排列”。

2) 逐步进行拆解,并写出分析思路和对应的SQL思路:

① 对课程号进行分组,计算每一门课程的平均成绩;

② 对①的结果指定条件“>=80”;

③ 对②的结果进行降序排列;

我们可以把拆解后的思路套用到下方的公式中:

select 查询结果
from 从那张表中查找数据
where 查询条件(运算符、模糊查询)
group by 分组(每个)
having 对分组结果指定条件
order by 对查询结果排序
limit 从查询结果中取出指定行;

试一下吧:

select 查询结果[课程号,avg(成绩)]
from 从那张表中查找数据[成绩表score]
where 查询条件(运算符、模糊查询)[No]
group by 分组(每个)[课程号]
having 对分组结果指定条件[avg(成绩)>=80]
order by 对查询结果排序[avg(成绩)desc]
limit 从查询结果中取出指定行;[No]

这样子,问题是不是就迎刃而解呢?

推荐学习:mysql视频教程

以上がmysqlでグループ化して合計する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。