文章目錄
- 1. 聚合函數
- 1.1 COUNT() 函數
- 1.2 SUM() 函數
- 1.3 AVG() 函數
- 1.4 MIN() 函數
- 1.5 MAX() 函數
- 2. GROUP BY 子句
- 2.1 使用 GROUP BY 進行數據分組
- 2.2 結合聚合函數
- 3. HAVING 子句
- 3.1 使用 HAVING 過濾分組數據
- 3.2 HAVING 和 WHERE 的區別
- 4. 實踐任務
- 4.1 創建一個銷售表
- 4.2 向表中插入數據
- 4.3 使用聚合函數進行數據計算
- 4.3.1 計算總銷售額
- 4.3.2 計算每個地區的總銷售額
- 4.3.3 計算平均銷售額
- 4.3.4 計算每個地區的平均銷售額
- 4.3.5 查找最大和最小銷售額
- 4.4 使用 HAVING 進行分組過濾
- 4.4.1顯示銷售總額大于1500的地區
- 4.4.2 顯示平均銷售額大于1000的地區
- 5. 總結
1. 聚合函數
聚合函數用于在SQL中對一組數據進行計算,返回單一結果。以下是常用的聚合函數:
1.1 COUNT() 函數
COUNT()
函數用于計算某個列中的行數,或計算符合條件的行數。
- 計算某列的行數:
SELECT COUNT(column_name) FROM table_name;
這個查詢會計算column_name
列中非空值的數量。
- 計算所有行數(包括NULL值):
SELECT COUNT(*) FROM table_name;
- 計算符合條件的行數:
SELECT COUNT(*) FROM table_name WHERE condition;
1.2 SUM() 函數
SUM()
函數用于計算某列的總和,通常用于數值類型的列。
計算總和:
SELECT SUM(column_name) FROM table_name;
該查詢會返回column_name
列的總和。
1.3 AVG() 函數
AVG()
函數用于計算某列的平均值,通常也用于數值類型的列。
計算平均值:
SELECT AVG(column_name) FROM table_name;
該查詢會返回column_name
列的平均值。
1.4 MIN() 函數
MIN()
函數用于獲取某列中的最小值。
- 計算最小值:
SELECT MIN(column_name) FROM table_name;
該查詢返回column_name
列中的最小值。
1.5 MAX() 函數
MAX()
函數用于獲取某列中的最大值。
計算最大值:
SELECT MAX(column_name) FROM table_name;
該查詢返回column_name
列中的最大值。
2. GROUP BY 子句
GROUP BY
用于將數據按照某一列進行分組。分組后的每個組都會進行一次聚合操作,如計算總和、平均值等。
2.1 使用 GROUP BY 進行數據分組
GROUP BY
按指定列對數據進行分組,并對每個組進行聚合操作。
按列分組:
SELECT column_name, COUNT(*)
FROM table_name
GROUP BY column_name;
這個查詢會按column_name
進行分組,并計算每個組的行數。
2.2 結合聚合函數
你可以結合聚合函數與GROUP BY使用,計算每個分組的聚合值。
- 按地區分組計算總銷售額:
假設有一個銷售表,包含region(地區)和sales(銷售額)列,可以按地區計算每個地區的總銷售額:
SELECT region, SUM(sales)
FROM sales_data
GROUP BY region;
- 這會顯示每個地區的銷售總額。
按部門分組計算員工人數:
假設有一個員工表,包含department(部門)和employee_id(員工ID)列,可以按部門計算每個部門的員工人數:
``sql
SELECT department, COUNT(employee_id)
FROM employees
GROUP BY department;
## 2.3 多列分組
`GROUP BY`可以按多個列進行分組。
* 按地區和年份分組計算銷售總額:
```sql
SELECT region, year, SUM(sales)
FROM sales_data
GROUP BY region, year;
3. HAVING 子句
HAVING
子句用于在數據分組后進行過濾。與WHERE不同,WHERE是在數據分組前進行過濾,而HAVING是在分組后的結果上進行過濾。
3.1 使用 HAVING 過濾分組數據
HAVING
子句可以與聚合函數一起使用,用來過濾掉不符合條件的分組。
- 計算每個地區的銷售總額,并只顯示銷售總額大于1000的地區:
SELECT region, SUM(sales)
FROM sales_data
GROUP BY region
HAVING SUM(sales) > 1000;
這個查詢首先按地區分組,然后計算每個地區的銷售總額,最后只顯示銷售總額大于1000的地區。
- 計算每個部門的員工人數,并只顯示員工人數大于10的部門:
SELECT department, COUNT(employee_id)
FROM employees
GROUP BY department
HAVING COUNT(employee_id) > 10;
3.2 HAVING 和 WHERE 的區別
- WHERE:用于對原始數據進行過濾,WHERE是在聚合之前執行的。
- HAVING :用于對分組后的數據進行過濾,HAVING是在聚合之后執行的。
例如:
- WHERE過濾原始數據:
SELECT * FROM sales_data WHERE region = 'North';
- HAVING過濾分組數據:
SELECT region, SUM(sales) FROM sales_data GROUP BY region HAVING SUM(sales) > 1000;
4. 實踐任務
4.1 創建一個銷售表
CREATE TABLE sales_data (id INT AUTO_INCREMENT PRIMARY KEY,region VARCHAR(100),sales DECIMAL(10, 2),year INT
);
4.2 向表中插入數據
INSERT INTO sales_data (region, sales, year) VALUES
('North', 1500.50, 2023),
('South', 1000.75, 2023),
('East', 500.00, 2023),
('West', 1200.30, 2023),
('North', 1800.00, 2024),
('South', 2000.00, 2024),
('East', 1200.00, 2024),
('West', 1500.00, 2024);
4.3 使用聚合函數進行數據計算
4.3.1 計算總銷售額
計算所有地區的總銷售額:
SELECT SUM(sales) AS total_sales FROM sales_data;
4.3.2 計算每個地區的總銷售額
按地區分組計算每個地區的銷售總額,可以使用GROUP BY:
SELECT region, SUM(sales) AS total_sales
FROM sales_data
GROUP BY region;
4.3.3 計算平均銷售額
計算所有地區的平均銷售額:
SELECT AVG(sales) AS average_sales FROM sales_data;
4.3.4 計算每個地區的平均銷售額
按地區分組計算每個地區的平均銷售額,使用以下語句:
SELECT region, AVG(sales) AS average_sales
FROM sales_data
GROUP BY region;
4.3.5 查找最大和最小銷售額
使用MAX()和MIN()函數分別查找銷售額的最大值和最小值:
- 查找最大銷售額:
SELECT MAX(sales) AS max_sales FROM sales_data;
- 查找最小銷售額:
SELECT MIN(sales) AS min_sales FROM sales_data;
4.4 使用 HAVING 進行分組過濾
使用HAVING子句來過濾已經分組的數據。例如,我們可以只顯示銷售總額大于1500的地區。
4.4.1顯示銷售總額大于1500的地區
SELECT region, SUM(sales) AS total_sales
FROM sales_data
GROUP BY region
HAVING SUM(sales) > 1500;
4.4.2 顯示平均銷售額大于1000的地區
SELECT region, AVG(sales) AS average_sales
FROM sales_data
GROUP BY region
HAVING AVG(sales) > 1000;
5. 總結
- 聚合函數:用于計算一組數據的統計信息,如行數、總和、平均值、最大值、最小值等。
- GROUP BY:用于將數據按指定列進行分組,并對每個組進行聚合計算。
- HAVING :用于過濾分組后的數據,通常與聚合函數一起使用。