SQL 使用 group by 和 having 子句
在本文中,我们将介绍如何使用 SQL 中的 group by 和 having 子句来对数据进行分组和筛选。
阅读更多:SQL 教程
什么是 group by 子句?
在 SQL 中,group by 子句用于将数据按照一个或多个列进行分组。它可以根据指定的列值将数据分组,并对每个组应用聚合函数,如求和、计数、平均值等。
下面是一个示例表格,用于说明 group by 子句的用法:
CREATE TABLE orders (
order_id INT,
customer_id INT,
order_date DATE,
total_amount DECIMAL(10, 2)
);
INSERT INTO orders (order_id, customer_id, order_date, total_amount)
VALUES
(1, 1001, '2022-01-01', 100.00),
(2, 1001, '2022-01-02', 150.00),
(3, 1002, '2022-01-03', 200.00),
(4, 1002, '2022-01-04', 120.00),
(5, 1002, '2022-01-05', 300.00);
现在,假设我们想要计算每个客户的总订单金额。我们可以使用以下 SQL 查询语句来实现:
SELECT customer_id, SUM(total_amount) AS total_order_amount
FROM orders
GROUP BY customer_id;
运行以上查询语句后,将会得到以下结果:
customer_id | total_order_amount
------------|------------------
1001 | 250.00
1002 | 620.00
可以看到,结果按照客户ID进行了分组,并计算了每个客户的总订单金额。
什么是 having 子句?
having 子句用于对分组后的数据进行筛选。它可以根据聚合函数的结果来筛选数据,类似于 where 子句,但 having 子句是在 group by 子句之后执行的。
以下示例将说明如何使用 having 子句:
SELECT customer_id, SUM(total_amount) AS total_order_amount
FROM orders
GROUP BY customer_id
HAVING total_order_amount > 300;
运行以上查询语句后,将会得到以下结果:
customer_id | total_order_amount
------------|------------------
1002 | 620.00
在这个例子中,我们只要求返回总订单金额大于300的客户,因此只返回了客户ID为1002的数据行。
多个列分组和筛选
除了单个列之外,我们还可以使用多个列进行分组和筛选。例如,假设我们想要按照客户ID和订单日期来计算每个客户每天的订单总金额,我们可以使用以下查询语句:
SELECT customer_id, order_date, SUM(total_amount) AS total_order_amount
FROM orders
GROUP BY customer_id, order_date
HAVING total_order_amount > 100;
这将返回所有订单总金额大于100的客户以及他们每天的订单数据。
总结
本文介绍了 SQL 中的 group by 和 having 子句的基本用法。group by 子句用于对数据进行分组,而 having 子句用于筛选分组后的数据。通过理解和熟练运用这两个关键字,我们可以更好地处理和分析数据,从而得出有意义的结论。希望本文对您学习和使用 SQL 有所帮助!
极客教程