最近在一个项目自中用到了BigDecimal类,当时直接使用从数据库返回的数据对数据做数值方面的处理,当时使用了COUNT()函数和SUM()函数,在项目测试的时候,报了空指针异常(java.lang.NullPointerException: null),寻找到出错点,原来是BigDecimal构造器传入了null值,对代码进行分析,原来是SUM()函数的使用,出现了错误,没有对SUM()函数返回值做null值判断导致。
接下来,仔细看了看MySQL的COUNT()函数和SUM()函数使用。
MySQL COUNT()函数
COUNT()函数返回表中的行数。 COUNT()函数允许您对表中符合特定条件的所有行进行计数。
COUNT(expression)
COUNT()函数的返回类型为BIGINT。 如果没有找到匹配的行,则COUNT()函数返回0。
COUNT函数有几种形式:COUNT(*),COUNT(expression)和COUNT(DISTINCT expression)。
COUNT(*)函数返回由SELECT语句返回的结果集中的行数。COUNT(*)函数计算包含NULL和非NULL值的行,即:所有行。
如果使用COUNT(*)函数对表中的数字行进行计数,而不使用WHERE子句选择其他列,则其执行速度非常快。
COUNT(expression)返回不包含NULL值的行数。
MySQL COUNT(DISTINCT expression)返回不包含NULL值的唯一行数。
USE testdb;
-- create a demos table
CREATE TABLE IF NOT EXISTS demos(
id int auto_increment primary key,
val int
);
-- insert some sample data
INSERT INTO demos(val)
VALUES(1),(1),(2),(2),(NULL),(3),(4),(NULL),(5);
-- select data from demos table
SELECT * FROM demos;
执行上面查询语句,得到以下结果 -
+----+------+
| id | val |
+----+------+
| 1 | 1 |
| 2 | 1 |
| 3 | 2 |
| 4 | 2 |
| 5 | NULL |
| 6 | 3 |
| 7 | 4 |
| 8 | NULL |
| 9 | 5 |
+----+------+
9 rows in set
使用COUNT(*)函数的情况如下:
mysql> SELECT COUNT(*) FROM demos;
+----------+
| COUNT(*) |
+----------+
| 9 |
+----------+
1 row in set
使用COUNT(expression)函数的情况如下:
mysql> SELECT COUNT(val) FROM demos;
+---------------------+
| COUNT(DISTINCT val) |
+---------------------+
| 7 |
+---------------------+
1 row in set
使用COUNT(DISTINCT expression)函数的情况如下:
mysql> SELECT COUNT(DISTINCT val) FROM demos;
+---------------------+
| COUNT(DISTINCT val) |
+---------------------+
| 5 |
+---------------------+
1 row in set
MySQL SUM()函数
SUM()函数用于计算一组值或表达式的总和,SUM()函数的语法如下:
SUM(DISTINCT expression)
SUM()函数是如何工作的?
- 如果在没有返回匹配行SELECT语句中使用SUM函数,则SUM函数返回NULL,而不是0。
- DISTINCT运算符允许计算集合中的不同值。
- SUM函数忽略计算中的NULL值。
如果没有匹配的行,则SUM函数返回NULL值。
mysql> SELECT SUM(val) FROM demos WHERE id = 5;
+-------------------------+
| SUM(val) |
+-------------------------+
| NULL |
+-------------------------+
有时,您希望SUM函数返回0而不是NULL。 在这种情况下,可以使用COALESCE函数。COALESCE函数接受两个参数,如果第一个参数为NULL,则返回第二个参数,否则返回第一个参数。
mysql> SELECT COALESCE(SUM(id),0) FROM demos WHERE val = 1;
+--------------------------+
| COALESCE(SUM(id),0) |
+--------------------------+
| 3 |
+--------------------------+