SQL 添加列与对具有 NULL 值的列求和之间存在差异
SQL discrepancy between addition of columns and summing of a columns with NULL values
当我将两列 v
和 w
加在一起时,如果一个或两个被加数是 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不一致,有时不可移植。
当我将两列 v
和 w
加在一起时,如果一个或两个被加数是 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 节(
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不一致,有时不可移植。