摘要:在本教程中,您将学习如何使用 MySQL SUM()
函数来计算集合中值的总和。
MySQL SUM()
函数简介
SUM()
函数是一个聚合函数,可让您计算集合中值的总和。 SUM()
函数的语法如下:
SUM(DISTINCT expression)
Code language: SQL (Structured Query Language) (sql)
以下是SUM()
函数的工作原理:
- 如果在不返回行的
SELECT
语句中使用SUM()
函数,SUM()
函数将返回NULL
,而不是零。 -
DISTINCT
选项指示SUM()
函数仅计算集合中不同值的总和。 -
SUM()
函数忽略计算中的NULL
值。
MySQL SUM()
函数图解
首先,创建一个名为sum_demo
的新表:
CREATE TABLE sum_demo (
n INT
);
Code language: SQL (Structured Query Language) (sql)
然后,将一些行插入到sum_demo
表中:
INSERT INTO sum_demo(n)
VALUES(1),(1),(2),(NULL),(3);
Code language: SQL (Structured Query Language) (sql)
第三,使用SUM()
函数计算第n
列中的总计值:
SELECT
SUM(n)
FROM
sum_demo;
Code language: SQL (Structured Query Language) (sql)
正如您所看到的, SUM()
函数计算 1、1、2 和 3 的总和。并且它忽略 NULL。
最后,使用带有DISTINCT
选项的SUM()
来计算第n
列中的总值:
SELECT
SUM(DISTINCT n)
FROM
sum_demo;
Code language: SQL (Structured Query Language) (sql)
在这种情况下,带有DISTINCT
选项的SUM()
仅计算不同值 1、2 和 3 的总和。
MySQL SUM()
函数示例
我们来看看示例数据库中的orderdetails
表。
1) 简单的MySQL SUM()
函数示例
此示例使用SUM()
函数获取订单详细信息的商品总数:
SELECT
SUM(quantityOrdered) SalesQuantity
FROM
orderdetails;
Code language: SQL (Structured Query Language) (sql)
2) MySQL SUM()
函数及表达式示例
以下显示订单号 10110 的订单行项目:
SELECT
orderNumber,
quantityOrdered,
priceEach
FROM
orderdetails
WHERE
orderNumber = 10100;
Code language: SQL (Structured Query Language) (sql)
要计算订单号 10110 的总计,请使用SUM()
函数,如下所示:
SELECT
SUM(quantityOrdered * priceEach) orderTotal
FROM
orderdetails
WHERE
orderNumber = 10100;
Code language: SQL (Structured Query Language) (sql)
在本教程中, SUM()
函数计算订单号 10110 的所有订单行项目的以下表达式的总和:
quantityOrdered * priceEach
Code language: SQL (Structured Query Language) (sql)
3) MySQL SUM()
与GROUP BY
子句示例
SUM()
函数通常与GROUP BY
子句一起使用来计算每个组的总和。
例如,您可以使用带有GROUP BY
子句的SUM()
函数来计算每个订单的总金额,如以下查询所示:
SELECT
orderNumber,
SUM(quantityOrdered * priceEach) orderTotal
FROM
orderdetails
GROUP BY
orderNumber
ORDER BY
orderTotal DESC;
Code language: SQL (Structured Query Language) (sql)
在这个例子中:
GROUP BY
子句将订单详细信息分为按订单号分组的组。-
SUM()
函数计算每个订单的每个金额的总和。
4) MySQL SUM()
与HAVING
子句示例
您可以在HAVING
子句中使用SUM()
函数来过滤组。本例说明如何选择订单金额大于60,000
的订单。
SELECT
orderNumber,
SUM(quantityOrdered * priceEach) orderTotal
FROM
orderdetails
GROUP BY
orderNumber
HAVING
SUM(quantityOrdered * priceEach) > 60000
ORDER BY
orderTotal;
Code language: SQL (Structured Query Language) (sql)
5) MySQL SUM()
与NULL
示例
如果结果集为空, SUM()
函数将返回NULL
。有时,您可能希望SUM()
函数返回零而不是NULL
。
在这种情况下,您可以使用COALESCE()
函数。 COALESCE
函数接受两个参数,如果第一个参数为NULL
,则返回第二个参数;否则,它返回第一个参数。
请参阅以下查询:
SELECT
COALESCE(SUM(quantityOrdered * priceEach), 0) result
FROM
orderdetails
WHERE
productCode = 'S1_20';
Code language: SQL (Structured Query Language) (sql)
6) MySQL SUM()
与连接示例
请参阅以下orders
和orderdetails
表:
您可以在带有JOIN
子句的SELECT
中使用SUM()
函数,根据另一个表中的值指定的条件来计算一个表中的值的总和。
此语句使用SUM()
函数计算已取消订单的总金额:
SELECT
SUM(quantityOrdered * priceEach) cancelled_amount
FROM
orderdetails
INNER JOIN orders USING (orderNumber)
WHERE
status = 'Cancelled';
Code language: SQL (Structured Query Language) (sql)
7) MySQL SUM IF 示例
以下语句使用SUM()
函数计算每个订单状态的已售商品数量:
SELECT
status,
SUM(quantityOrdered)
FROM
orderdetails
INNER JOIN
orders USING (orderNumber)
GROUP BY status;
Code language: SQL (Structured Query Language) (sql)
如果要将行旋转为列,可以将SUM()
函数与CASE
表达式结合使用。这是一种SUMIF
逻辑:
SELECT
SUM(CASE
WHEN status = 'Shipped' THEN quantityOrdered
END) qty_shipped,
SUM(CASE
WHEN status = 'Resolved' THEN quantityOrdered
END) qty_resolved,
SUM(CASE
WHEN status = 'Cancelled' THEN quantityOrdered
END) qty_cancelled,
SUM(CASE
WHEN status = 'On Hold' THEN quantityOrdered
END) qty_on_hold,
SUM(CASE
WHEN status = 'Disputed' THEN quantityOrdered
END) qty_on_disputed,
SUM(CASE
WHEN status = 'In Process' THEN quantityOrdered
END) qty_in_process
FROM
orderdetails
INNER JOIN
orders USING (orderNumber);
Code language: SQL (Structured Query Language) (sql)
在本教程中,您学习了如何使用 MySQL SUM()
函数来计算一组值的总和。