SQL 使用 group by 和 having 子句

SQL 使用 group by 和 having 子句

在本文中,我们将介绍如何使用 SQL 中的 group byhaving 子句来对数据进行分组和筛选。

阅读更多: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

现在,假设我们想要计算每个客户的总订单金额。我们可以使用以下 SQL 查询语句来实现:

SELECT customer_id, SUM(total_amount) AS total_order_amount
FROM orders
GROUP BY customer_id;
SQL

运行以上查询语句后,将会得到以下结果:

customer_id | total_order_amount
------------|------------------
1001        | 250.00
1002        | 620.00
SQL

可以看到,结果按照客户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;
SQL

运行以上查询语句后,将会得到以下结果:

customer_id | total_order_amount
------------|------------------
1002        | 620.00
SQL

在这个例子中,我们只要求返回总订单金额大于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;
SQL

这将返回所有订单总金额大于100的客户以及他们每天的订单数据。

总结

本文介绍了 SQL 中的 group byhaving 子句的基本用法。group by 子句用于对数据进行分组,而 having 子句用于筛选分组后的数据。通过理解和熟练运用这两个关键字,我们可以更好地处理和分析数据,从而得出有意义的结论。希望本文对您学习和使用 SQL 有所帮助!

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册