SQL 添加列与对具有 NULL 值的列求和之间存在差异

SQL discrepancy between addition of columns and summing of a columns with NULL values

当我将两列 vw 加在一起时,如果一个或两个被加数是 NULL,则行的结果会给出 NULL。这是有道理的。但是,如果我用 SUM(v) 对列求和,即使有 NULL 也会得到一个数字结果。这是因为实际方便吗?还是有理论上的依据?

这里有一个例子来说明(MySQL 和 sqlite):

CREATE TABLE x0 (
  id    INTEGER 
, v     DOUBLE
, w     DOUBLE
);

INSERT INTO x0 VALUES
  (1,    1,     1)
, (2,    1,     1)
, (3, NULL,     1)
, (4,    1,  NULL)
, (5, NULL,  NULL)
;

-- NULL if summand is NULL
SELECT v+w
FROM x0
;
-- v+w
-- 2
-- 2
-- \N
-- \N
-- \N

-- NULL if summand is NULL
SELECT id, v+w, SUM(v+w)
FROM x0
GROUP BY id
;
-- id   v+w SUM(v+w)
-- 1    2   2
-- 2    2   2
-- 3    \N  \N
-- 4    \N  \N
-- 5    \N  \N


-- There is numeric results even if some summands are NULL    
SELECT SUM(v), SUM(w)
FROM x0
;
-- SUM(v)   SUM(w)
-- 3        3

这是正常的。您必须使用适当的函数管理空值

例如 mysql

 SELECT id, ifnull(v,0)+infnull(w,0), SUM(ifnull(v,0)+infnull(w,0))
 FROM x0
 GROUP BY id

http://rustyrazorblade.com/2006/09/mysql-number-null-null/ https://www.tutorialspoint.com/mysql/mysql-null-values.htm https://dev.mysql.com/doc/refman/5.7/en/working-with-null.html https://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html

ISO/IEC 9075:1992 Database Language SQL 在第 6.5 节()中说,一般规则,1) b):

let TX be the single-column table that is the result of applying the <value expression> to each row of T and eliminating null values.

这就是它所说的全部内容。所以聚合函数必须忽略 NULL,但是,正式地,没有理由。

此行为可追溯到第一个 SQL 实现(IBM System R、Oracle V2),当时设计人员可能认为这是个好主意。后来,没有人想破坏向后兼容性。

在这方面,和其他方面一样,SQL's handling of NULL values不一致,有时不可移植。