寫(xiě)在開(kāi)頭
MySQL數(shù)據(jù)庫(kù)的強(qiáng)大功能為我們提供了豐富的數(shù)據(jù)處理工具,其中GROUP BY與HAVING的應(yīng)用使得數(shù)據(jù)的分組與聚合變得更加靈活和高效。在本篇博客中,我們將深入研究GROUP BY與HAVING的基礎(chǔ)知識(shí),并通過(guò)實(shí)際案例,展示它們?cè)跀?shù)據(jù)分析中的強(qiáng)大威力。
創(chuàng)建水果銷(xiāo)售表
首先,為了更好地演示GROUP BY與HAVING的應(yīng)用,我們創(chuàng)建了一個(gè)水果銷(xiāo)售表fruit_sales
,包含字段:id
(銷(xiāo)售記錄ID)、fruit_name
(水果名稱)、sales_year
(銷(xiāo)售年份)、sales_quantity
(銷(xiāo)售量)、sales_revenue
(銷(xiāo)售額)。下面是一些示例數(shù)據(jù):
CREATE TABLE fruit_sales (
id INT PRIMARY KEY,
fruit_name VARCHAR(50),
sales_year INT,
sales_quantity INT,
sales_revenue DECIMAL(10, 2)
);
INSERT INTO fruit_sales (id, fruit_name, sales_year, sales_quantity, sales_revenue) VALUES
(1, 'Apple', 2022, 100, 150.00),
(2, 'Orange', 2022, 120, 180.00),
(3, 'Banana', 2022, 80, 90.00),
(4, 'Apple', 2023, 150, 225.00),
(5, 'Orange', 2023, 90, 108.00),
(6, 'Banana', 2023, 120, 144.00),
(7, 'Apple', 2024, 80, 120.00),
(8, 'Orange', 2024, 110, 132.00),
(9, 'Banana', 2024, 100, 120.00);
運(yùn)行下面語(yǔ)句,查詢所有數(shù)據(jù)。
SELECT
*
FROM
fruit_sales;
查詢所有數(shù)據(jù):
1 GROUP BY子句基礎(chǔ)
1.1 基本的GROUP BY語(yǔ)法
GROUP BY子句是MySQL中用于對(duì)結(jié)果進(jìn)行分組的關(guān)鍵。通過(guò)以下語(yǔ)法,我們可以按照指定列的值將結(jié)果分組:
SELECT fruit_name
FROM fruit_sales
GROUP BY fruit_name;
1.2 在SELECT中使用聚合函數(shù)
與GROUP BY結(jié)合使用聚合函數(shù),可以對(duì)每個(gè)分組進(jìn)行更詳細(xì)的統(tǒng)計(jì)分析:
SELECT
fruit_name,
AVG( sales_quantity ) AS avg_quantity,
SUM( sales_revenue ) AS total_revenue
FROM
fruit_sales
GROUP BY
fruit_name;
2 常見(jiàn)聚合函數(shù)
2.1 COUNT函數(shù):統(tǒng)計(jì)行數(shù)
COUNT函數(shù)用于統(tǒng)計(jì)指定列中的行數(shù),適用于對(duì)數(shù)據(jù)集大小進(jìn)行直觀認(rèn)識(shí)。在這里介紹三種常見(jiàn)的寫(xiě)法:
寫(xiě)法1:count(字段)
SELECT COUNT(id) AS total_sales
寫(xiě)法2:count(1)
SELECT COUNT(1) AS total_sales
寫(xiě)法3:count(*)
SELECT COUNT(*) AS total_sales
2.2 SUM函數(shù):求和
通過(guò)SUM函數(shù),我們可以計(jì)算某一列的總和,比如計(jì)算水果的總銷(xiāo)售額:
SELECT
SUM( sales_revenue ) AS total_revenue
FROM
fruit_sales;
2.3 AVG函數(shù):求平均值
AVG函數(shù)用于計(jì)算某一列的平均值,例如計(jì)算水果的平均銷(xiāo)售數(shù)量:
SELECT
AVG( sales_quantity ) AS avg_quantity
FROM
fruit_sales;
2.4 其他常見(jiàn)函數(shù)
MAX(): 用于獲取某列的最大值。
SELECT MAX(sales_quantity) FROM fruit_sales;
MIN(): 用于獲取某列的最小值。
SELECT MIN(sales_quantity) FROM fruit_sales;
GROUP_CONCAT(): 用于將組內(nèi)的值連接成字符串。
SELECT
GROUP_CONCAT( fruit_name ) fruits_category
FROM
fruit_sales
GROUP BY
sales_year;
STD() 和 STDDEV(): 分別用于計(jì)算總體標(biāo)準(zhǔn)差和樣本標(biāo)準(zhǔn)差。
SELECT
std( sales_quantity ) sales_quantity_std
FROM
fruit_sales;
SELECT
stddev( sales_quantity ) sales_quantity_stddev
FROM
fruit_sales;
VAR_POP() 和 VAR_SAMP(): 分別用于計(jì)算總體方差和樣本方差。
SELECT
var_pop( sales_quantity ) sales_quantity_var
FROM
fruit_sales;
SELECT
var_samp( sales_quantity ) sales_quantity_varsamp
FROM
fruit_sales;
3 GROUP BY子句的應(yīng)用
在MySQL中,GROUP BY子句是進(jìn)行分組操作的關(guān)鍵工具,它允許我們按照指定的列對(duì)結(jié)果進(jìn)行分類(lèi),從而進(jìn)行更加細(xì)致的數(shù)據(jù)分析。接下來(lái),我們將深入研究GROUP BY子句的不同應(yīng)用場(chǎng)景,并列舉一些實(shí)際的例子。
3.1 對(duì)結(jié)果進(jìn)行分組
基本的GROUP BY語(yǔ)法已經(jīng)在前文中介紹過(guò),這里我們來(lái)看一些更具體的例子。
3.1.1 按照年份分組統(tǒng)計(jì)水果銷(xiāo)售量
SELECT sales_year, SUM(sales_quantity) AS total_quantity
FROM fruit_sales
GROUP BY sales_year;
這個(gè)查詢會(huì)將銷(xiāo)售表按照年份分組,計(jì)算每年的總銷(xiāo)售量。
3.1.2 按照水果種類(lèi)和年份分組統(tǒng)計(jì)銷(xiāo)售額
SELECT fruit_name, sales_year, SUM(sales_revenue) AS total_revenue
FROM fruit_sales
GROUP BY fruit_name, sales_year;
這個(gè)查詢將銷(xiāo)售表按照水果種類(lèi)和年份兩個(gè)維度進(jìn)行分組,計(jì)算每種水果每年的總銷(xiāo)售額。
3.2 稍微復(fù)雜一些的聚合
結(jié)合GROUP BY和聚合函數(shù),我們可以在分組的基礎(chǔ)上對(duì)每個(gè)分組進(jìn)行各種統(tǒng)計(jì)操作,以下是一些示例。
3.2.1 計(jì)算每年平均銷(xiāo)售量和總銷(xiāo)售額
SELECT sales_year, AVG(sales_quantity) AS avg_quantity, SUM(sales_revenue) AS total_revenue
FROM fruit_sales
GROUP BY sales_year;
這個(gè)查詢會(huì)計(jì)算每年的平均銷(xiāo)售量和總銷(xiāo)售額。
3.2.2 查找每種水果的最大銷(xiāo)售量和最小銷(xiāo)售額
SELECT fruit_name, MAX(sales_quantity) AS max_quantity, MIN(sales_revenue) AS min_revenue
FROM fruit_sales
GROUP BY fruit_name;
這個(gè)查詢會(huì)找出每種水果的最大銷(xiāo)售量和最小銷(xiāo)售額。
4 聚合函數(shù)的條件運(yùn)用
在實(shí)際的數(shù)據(jù)分析過(guò)程中,經(jīng)常需要根據(jù)特定條件對(duì)數(shù)據(jù)進(jìn)行聚合分析。聚合函數(shù)的條件運(yùn)用主要通過(guò)在聚合函數(shù)內(nèi)部結(jié)合使用WHERE
子句和HAVING
子句來(lái)實(shí)現(xiàn),讓我們深入探討各種應(yīng)用場(chǎng)景。
4.1 示例:統(tǒng)計(jì)每個(gè)水果在銷(xiāo)售年份為2023年的銷(xiāo)售量
SELECT fruit_name, SUM(sales_quantity) AS total_quantity
FROM fruit_sales
WHERE sales_year = 2023
GROUP BY fruit_name;
在這個(gè)例子中,WHERE
子句用于篩選出銷(xiāo)售年份為2023年的數(shù)據(jù),然后通過(guò)SUM
函數(shù)計(jì)算每個(gè)水果的總銷(xiāo)售量。
4.2 示例:計(jì)算銷(xiāo)售額超過(guò)100的水果的平均銷(xiāo)售量
SELECT fruit_name, AVG(sales_quantity) AS avg_quantity
FROM fruit_sales
WHERE sales_revenue > 100
GROUP BY fruit_name;
在這個(gè)例子中,WHERE
子句用于篩選出銷(xiāo)售額超過(guò)100的數(shù)據(jù),然后通過(guò)AVG
函數(shù)計(jì)算每個(gè)水果的平均銷(xiāo)售量。
5 HAVING子句的應(yīng)用
在MySQL中,HAVING子句通常用于對(duì)GROUP BY的結(jié)果進(jìn)行條件過(guò)濾。它在很大程度上類(lèi)似于WHERE子句,但WHERE用于過(guò)濾行,而HAVING用于過(guò)濾組。下面我們將詳細(xì)展開(kāi)HAVING的應(yīng)用,并列舉一些實(shí)際場(chǎng)景中的使用案例。
5.1 在GROUP BY的基礎(chǔ)上使用HAVING
當(dāng)我們通過(guò)GROUP BY對(duì)數(shù)據(jù)進(jìn)行分組后,有時(shí)候希望進(jìn)一步篩選出符合特定條件的組,這時(shí)就需要使用HAVING子句。以下是一個(gè)簡(jiǎn)單的例子:
SELECT sales_year, fruit_name, AVG(sales_quantity) AS avg_quantity
FROM fruit_sales
GROUP BY sales_year, fruit_name
HAVING avg_quantity > 100;
在這個(gè)例子中,我們首先按年份和水果名稱對(duì)數(shù)據(jù)進(jìn)行了分組,然后使用HAVING篩選出平均銷(xiāo)售數(shù)量超過(guò)100的組。
5.2 HAVING與聚合函數(shù)的進(jìn)一步結(jié)合
HAVING經(jīng)常與聚合函數(shù)一起使用,以便更精細(xì)地過(guò)濾分組。以下是一個(gè)例子,我們想找出銷(xiāo)售額最高的水果,但只考慮那些銷(xiāo)售額總和超過(guò)500的水果:
SELECT fruit_name, SUM(sales_revenue) AS total_revenue
FROM fruit_sales
GROUP BY fruit_name
HAVING total_revenue > 500;
這個(gè)查詢首先按水果名稱分組,然后計(jì)算每個(gè)組的銷(xiāo)售額總和,最后通過(guò)HAVING過(guò)濾出總銷(xiāo)售額超過(guò)500的水果。
5.3 多條件的HAVING過(guò)濾
HAVING也可以使用多個(gè)條件進(jìn)行過(guò)濾,從而更靈活地滿足復(fù)雜的查詢需求。例如,我們想找出在2023年和2024年都有銷(xiāo)售記錄的水果:
SELECT fruit_name, COUNT(DISTINCT sales_year) AS years_with_sales
FROM fruit_sales
GROUP BY fruit_name
HAVING years_with_sales = 2;
這個(gè)查詢中,我們首先按水果名稱分組,然后使用COUNT(DISTINCT sales_year)計(jì)算每個(gè)組中不同年份的銷(xiāo)售記錄數(shù)量,最后通過(guò)HAVING過(guò)濾出年份數(shù)量為2的水果,即在2023年和2024年都有銷(xiāo)售記錄的水果。
5.4 HAVING與其他條件的結(jié)合
在實(shí)際應(yīng)用中,HAVING通常與其他條件一起使用,以進(jìn)一步精煉查詢結(jié)果。例如,我們想找出在2022年以后有銷(xiāo)售記錄的水果中,銷(xiāo)售額總和超過(guò)200的水果:
SELECT fruit_name, SUM(sales_revenue) AS total_revenue
FROM fruit_sales
WHERE sales_year >= 2022
GROUP BY fruit_name
HAVING total_revenue > 200;
這個(gè)查詢中,我們首先使用WHERE條件篩選出銷(xiāo)售年份在2022年及以后的數(shù)據(jù),然后按水果名稱分組,并通過(guò)HAVING進(jìn)一步過(guò)濾出銷(xiāo)售額總和超過(guò)200的水果。
5.5 HAVING與聚合函數(shù)的嵌套
在某些情況下,我們可能需要對(duì)聚合函數(shù)的結(jié)果再次進(jìn)行聚合,這時(shí)HAVING與聚合函數(shù)的嵌套就派上用場(chǎng)了。例如,我們想找出每個(gè)水果銷(xiāo)售量的平均值超過(guò)所有水果平均銷(xiāo)售量的水果:
SELECT fruit_name, AVG(sales_quantity) AS avg_quantity
FROM fruit_sales
GROUP BY fruit_name
HAVING avg_quantity > (SELECT AVG(sales_quantity) FROM fruit_sales);
這個(gè)查詢中,我們首先按水果名稱分組,計(jì)算每個(gè)組的銷(xiāo)售量平均值,然后通過(guò)HAVING子句篩選出平均銷(xiāo)售量超過(guò)所有水果平均銷(xiāo)售量的水果。
6 GROUP BY與多表查詢的結(jié)合使用
在實(shí)際的數(shù)據(jù)庫(kù)應(yīng)用中,數(shù)據(jù)通常存儲(chǔ)在多個(gè)表中,因此對(duì)這些表進(jìn)行聯(lián)合查詢并進(jìn)行適當(dāng)?shù)姆纸M是非常普遍的操作。GROUP BY與多表查詢的結(jié)合使用能夠?yàn)槲覀兲峁└钊氲臄?shù)據(jù)分析和統(tǒng)計(jì)能力。
6.1 使用GROUP BY對(duì)多表進(jìn)行分組
在涉及多表查詢時(shí),GROUP BY可以幫助我們對(duì)結(jié)果進(jìn)行更有意義的分組。考慮以下示例,我們有一個(gè)水果銷(xiāo)售表fruit_sales
和一個(gè)水果類(lèi)別表fruit_categories
:
CREATE TABLE fruit_categories (
id INT PRIMARY KEY,
fruit_name VARCHAR(50),
category VARCHAR(50)
);
INSERT INTO fruit_categories (id, fruit_name, category) VALUES
(1, 'Apple', 'hard'),
(2, 'Orange', 'soft'),
(3, 'Banana', 'soft');
現(xiàn)在,我們想要按照水果類(lèi)別進(jìn)行銷(xiāo)售量的統(tǒng)計(jì),可以使用如下查詢:
SELECT
fc.category,
SUM( fs.sales_quantity ) AS total_quantity
FROM
fruit_sales fs
JOIN fruit_categories fc ON fs.fruit_name = fc.fruit_name
GROUP BY
fc.category;
這個(gè)查詢將fruit_sales
和fruit_categories
兩個(gè)表聯(lián)合起來(lái),按照水果類(lèi)別進(jìn)行分組,然后計(jì)算每個(gè)類(lèi)別的總銷(xiāo)售量。這對(duì)于分析不同類(lèi)別水果的整體銷(xiāo)售表現(xiàn)非常有幫助。
6.2 GROUP BY與JOIN操作的協(xié)同應(yīng)用
在多表查詢中,JOIN操作和GROUP BY可以協(xié)同使用,為我們提供更為復(fù)雜的數(shù)據(jù)統(tǒng)計(jì)和分析??紤]以下場(chǎng)景,我們要找出每個(gè)水果類(lèi)別的平均銷(xiāo)售額:
SELECT
fc.category,
AVG( fs.sales_revenue ) AS avg_revenue
FROM
fruit_sales fs
JOIN fruit_categories fc ON fs.fruit_name = fc.fruit_name
GROUP BY
fc.category;
這個(gè)查詢首先通過(guò)JOIN將fruit_sales
和fruit_categories
兩個(gè)表關(guān)聯(lián),然后按照水果類(lèi)別進(jìn)行分組,最后計(jì)算每個(gè)類(lèi)別的平均銷(xiāo)售額。這樣的查詢可以為市場(chǎng)策略制定、庫(kù)存管理等方面提供重要的數(shù)據(jù)支持。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-791277.html
寫(xiě)在最后
通過(guò)本篇MySQL修煉手冊(cè),我們深入研究了GROUP BY與HAVING的應(yīng)用,以及它們?cè)诓煌瑘?chǎng)景下的運(yùn)用技巧。掌握這些知識(shí),將使我們?cè)趯?shí)際應(yīng)用中更加游刃有余地處理復(fù)雜的數(shù)據(jù)分析與統(tǒng)計(jì)任務(wù)。在下一篇手冊(cè)中,我們將繼續(xù)拓展MySQL的強(qiáng)大功能,探討更多高級(jí)查詢與優(yōu)化技巧,為數(shù)據(jù)庫(kù)操作的深入理解打下堅(jiān)實(shí)基礎(chǔ)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-791277.html
到了這里,關(guān)于MySQL修煉手冊(cè)4:分組與聚合:GROUP BY與HAVING的應(yīng)用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!