面試官:分組查詢(GROUP BY)會用不?
共 4636字,需瀏覽 10分鐘
·
2024-06-14 10:51
在MySQL中,GROUP BY是一個SQL語句中的子句,用于將查詢結(jié)果集中的行根據(jù)一個或多個列的值進(jìn)行分組。分組的目的是將具有相同值的行歸為一組,這樣就可以對每個組應(yīng)用聚合函數(shù)(如SUM, AVG, MAX, MIN, COUNT等)來進(jìn)行計(jì)算,從而實(shí)現(xiàn)對各組數(shù)據(jù)的統(tǒng)計(jì)分析。
在MySQL中,分組查詢(GROUP BY)是一種非常實(shí)用的功能,允許你根據(jù)一個或多個列將查詢結(jié)果集劃分成多個組,然后可以對每個組應(yīng)用聚合函數(shù)(如SUM, AVG, MAX, MIN, COUNT等)進(jìn)行計(jì)算。下面通過一個具體案例來說明分組查詢的使用方法。
具體案例一:
假設(shè)我們有一個名為employees的表,存儲了公司的員工信息,包括employee_id, name, department_id, salary等字段?,F(xiàn)在我們想統(tǒng)計(jì)每個部門(department_id)的員工人數(shù)和平均薪資。
SQL查詢示例
SELECT department_id, COUNT(employee_id) AS total_employees, AVG(salary) AS average_salary
FROM employees
GROUP BY department_id;
解釋
-
SELECT- 首先,我們指定了想要從查詢中獲取的列。這里我們選擇了department_id(分組依據(jù)),并使用聚合函數(shù)COUNT(employee_id)來計(jì)算每個部門的員工總數(shù),以及AVG(salary)來計(jì)算每個部門的平均薪資。 -
FROM employees- 指定查詢的表名為employees。 -
GROUP BY department_id- 這是分組查詢的關(guān)鍵部分,它指示MySQL根據(jù)department_id字段的值對結(jié)果集進(jìn)行分組。這意味著每一組內(nèi)的記錄都有相同的department_id值。 -
AS關(guān)鍵字 - 用于給聚合函數(shù)的計(jì)算結(jié)果起別名,使得輸出結(jié)果更易讀。例如,COUNT(employee_id) AS total_employees將計(jì)數(shù)結(jié)果顯示為total_employees。
預(yù)期結(jié)果
假設(shè)employees表中的數(shù)據(jù)如下:
| employee_id | name | department_id | salary |
|---|---|---|---|
| 1 | Alice | 10 | 5000 |
| 2 | Bob | 10 | 6000 |
| 3 | Carol | 20 | 5500 |
| 4 | David | 20 | 7000 |
| 5 | Eve | 30 | 4500 |
執(zhí)行上面的SQL查詢后,預(yù)期的結(jié)果可能是:
| department_id | total_employees | average_salary |
|---|---|---|
| 10 | 2 | 5500 |
| 20 | 2 | 6250 |
| 30 | 1 | 4500 |
這個結(jié)果告訴我們,部門10有2名員工,平均薪資為5500元;部門20也是2名員工,平均薪資略高,為6250元;部門30則只有1名員工,薪資為4500元。通過這個案例,我們可以看到分組查詢在數(shù)據(jù)分析和報(bào)表生成中的強(qiáng)大作用。
具體案例二:
當(dāng)然,讓我們通過一個具體的案例來進(jìn)一步闡述MySQL中GROUP BY子句的使用。設(shè)想有一個銷售記錄表sales_records,包含以下字段:
-
product_id(產(chǎn)品ID) -
product_name(產(chǎn)品名稱) -
sale_date(銷售日期) -
quantity_sold(銷售數(shù)量)
我們的目標(biāo)是統(tǒng)計(jì)每個月每個產(chǎn)品的總銷售數(shù)量。
SQL查詢示例
SELECT
YEAR(sale_date) AS SaleYear,
MONTH(sale_date) AS SaleMonth,
product_id,
product_name,
SUM(quantity_sold) AS TotalQuantitySold
FROM
sales_records
GROUP BY
YEAR(sale_date),
MONTH(sale_date),
product_id;
解釋
-
SELECT- 我們選取了年份(通過YEAR(sale_date))、月份(通過MONTH(sale_date))、產(chǎn)品ID(product_id)、產(chǎn)品名稱(product_name),以及每個組的銷售總量(通過SUM(quantity_sold))。 -
FROM sales_records- 指定查詢的數(shù)據(jù)來源是sales_records表。 -
GROUP BY- 使用年份、月份和產(chǎn)品ID作為分組依據(jù)。這意味著結(jié)果將按照每年每月每個產(chǎn)品的銷售記錄被分組,每組內(nèi)包含了相同年月和產(chǎn)品ID的所有記錄。 -
SUM(quantity_sold)- 聚合函數(shù),用于計(jì)算每個組內(nèi)quantity_sold字段的總和,即每個月每個產(chǎn)品的銷售總量。
預(yù)期結(jié)果
假設(shè)sales_records表中有如下數(shù)據(jù)(簡化示例):
| product_id | product_name | sale_date | quantity_sold |
|---|---|---|---|
| 1 | Product A | 2024-01-10 | 5 |
| 1 | Product A | 2024-01-15 | 3 |
| 2 | Product B | 2024-01-12 | 7 |
| 2 | Product B | 2024-02-01 | 2 |
| 1 | Product A | 2024-02-05 | 4 |
執(zhí)行上述查詢后,可能得到的結(jié)果如下:
| SaleYear | SaleMonth | product_id | product_name | TotalQuantitySold |
|---|---|---|---|---|
| 2024 | 1 | 1 | Product A | 8 |
| 2024 | 1 | 2 | Product B | 7 |
| 2024 | 2 | 2 | Product B | 2 |
| 2024 | 2 | 1 | Product A | 4 |
這個結(jié)果展示了每個產(chǎn)品在每個月的總銷售數(shù)量,例如2024年1月,Product A總共賣出了8件,而Product B則賣出了7件。這樣,通過GROUP BY子句,我們能夠輕松地對復(fù)雜數(shù)據(jù)集進(jìn)行匯總和分析。
程序汪接私活項(xiàng)目目錄,2023年總結(jié)
Java項(xiàng)目分享 最新整理全集,找項(xiàng)目不累啦 07版
程序汪10萬接的無線共享充電寶項(xiàng)目,開發(fā)周期3個月
程序汪1萬接的企業(yè)官網(wǎng)項(xiàng)目,開發(fā)周期15天
程序汪8萬接的共享口罩項(xiàng)目,開發(fā)周期1個月
程序汪8萬塊的飲水機(jī)物聯(lián)網(wǎng)私活項(xiàng)目經(jīng)驗(yàn)分享
程序汪接的酒店在線開房項(xiàng)目,另外一個好聽的名字叫智慧酒店
歡迎添加程序汪個人微信 itwang008 進(jìn)粉絲群或圍觀朋友圈
