MySQL 是一款優(yōu)秀的關(guān)系型數(shù)據(jù)庫(kù),擁有強(qiáng)大的聚合功能。在實(shí)際應(yīng)用中,經(jīng)常需要對(duì)數(shù)據(jù)進(jìn)行多次聚合,以實(shí)現(xiàn)業(yè)務(wù)需求。本文將簡(jiǎn)要介紹 MySQL 多次聚合的實(shí)現(xiàn)方法。
假設(shè)有一張學(xué)生成績(jī)表,包含學(xué)生姓名和科目成績(jī)兩列:
CREATE TABLE scores ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) NOT NULL, subject VARCHAR(20) NOT NULL, score INT NOT NULL );
現(xiàn)在的需求是,對(duì)每個(gè)學(xué)生姓名,查詢其總分?jǐn)?shù)和平均分?jǐn)?shù)。可以使用如下 SQL 語句實(shí)現(xiàn):
SELECT name, SUM(score) AS total_score, AVG(score) AS avg_score FROM scores GROUP BY name;
聚合函數(shù)SUM
和AVG
分別計(jì)算每個(gè)學(xué)生的總分?jǐn)?shù)和平均分?jǐn)?shù)。
接下來的需求是,將每個(gè)學(xué)生的總分?jǐn)?shù)和平均分?jǐn)?shù)按照科目分別計(jì)算。可以使用如下 SQL 語句實(shí)現(xiàn):
SELECT name, subject, SUM(score) AS total_score, AVG(score) AS avg_score FROM scores GROUP BY name, subject;
這里將GROUP BY
中的列擴(kuò)展為兩列,即學(xué)生姓名和科目,以實(shí)現(xiàn)按照科目分別計(jì)算總分?jǐn)?shù)和平均分?jǐn)?shù)。
最后的需求是,按照每個(gè)科目,查詢總分?jǐn)?shù)和平均分?jǐn)?shù)最高的學(xué)生姓名和對(duì)應(yīng)的成績(jī)。可以使用如下 SQL 語句實(shí)現(xiàn):
SELECT subject, name, MAX(total_score) AS max_total_score, MAX(avg_score) AS max_avg_score FROM ( SELECT subject, name, SUM(score) AS total_score, AVG(score) AS avg_score FROM scores GROUP BY subject, name ) t GROUP BY subject;
這里先對(duì)學(xué)生姓名和科目進(jìn)行分組,計(jì)算每個(gè)學(xué)生在每個(gè)科目下的總分?jǐn)?shù)和平均分?jǐn)?shù),然后再對(duì)每個(gè)科目分組,查詢總分?jǐn)?shù)和平均分?jǐn)?shù)最高的學(xué)生。
綜上所述,MySQL 多次聚合的實(shí)現(xiàn)方法包括:GROUP BY
子句和子查詢。需要根據(jù)具體業(yè)務(wù)需求進(jìn)行合理選擇和使用。