文章目录
- 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 :用于过滤分组后的数据,通常与聚合函数一起使用。