2016-09-08 20 views
10

Thông thường khi NULL được tham gia vào bất kỳ phương trình sau đó toàn bộ kết quả giải quyết vào NULL (ví dụ SELECT 2 + NULL + 5 lợi nhuận NULL)Hiểu SUM (NULL) trong MySQL

Cùng nắm giữ đối với trường hợp sau đây:

SELECT SUM(NULL) lợi nhuận NULL. Proposition #1

Điều gì sẽ xảy ra khi SUM được sử dụng để tổng hợp cột và cột có thể chứa giá trị NULL?

Dựa trên proposition #1 lý do tại sao đầu ra không dẫn đến NULL.

CREATE TABLE t (age INT NULL); 

INSERT INTO t (age) VALUES (15),(20), (NULL), (30), (35); 

SELECT 
SUM(age) 
FROM t; 

Output:100

Nhưng tôi đã mong NULL.

MySQL có bỏ qua các giá trị NULL trong trường hợp này không?

http://sqlfiddle.com/#!9/3f99bb/2

+1

Cột có giá trị 'NULL' về cơ bản là' EMPTY', có nghĩa là cột của nó không được tính vào SUM. Rất nhiều lược đồ cơ sở dữ liệu sử dụng 'NULL' làm giá trị rỗng. Hãy tưởng tượng những người không thể tính toán 'SUM' của các cột khác của họ nữa. – Xatenev

+0

@Xatenev sau đó như ông chỉ, 'SELECT 2 + NULL + 5' nên là' 7'; – Jigar

+0

Không. Nó trả về 'NULL' @Jigar –

Trả lời

11

Vâng nó được giải thích trong manual

SUM ([DISTINCT] expr)
Trả về tổng của expr. Nếu tập hợp trả lại không có hàng, hàm SUM() trả về NULL. Từ khóa DISTINCT chỉ có thể được sử dụng để tính tổng các giá trị riêng biệt của expr.

SUM() trả về NULL nếu không có hàng phù hợp.

Hơn nữa nó cũng nói rằng:

Phần này mô tả các chức năng hoạt động trên bộ giá trị nhóm (tổng hợp). Trừ khi có quy định khác, các hàm nhóm bỏ qua các giá trị NULL .

nói cách khác SUM hoạt động như thế này vì đó là cách nó được xác định là.

+1

Từ khóa DISTINCT chỉ có thể được sử dụng để tính tổng các giá trị riêng biệt của ** expr ** - Dòng này có loại trừ 'NULL' không? Tôi đã đi qua các tài liệu trước khi gửi bài và không hiểu sức mạnh của dòng này. Không 'NULL' rơi vào' DISTINCT'? –

+0

khi bạn sử dụng khác biệt trong ngữ cảnh này, một lần nữa bạn đang nói về các giá trị không null bởi vì các giá trị null được bỏ qua ở đây – e4c5

+1

Trả lời nằm trong dòng này ** Phần này mô tả các hàm nhóm (tổng hợp) hoạt động trên tập các giá trị. Trừ khi có quy định khác, các hàm nhóm bỏ qua các giá trị NULL **. :) Missed that :(Cảm ơn rất nhiều –

4

Bạn có quyền, chức năng tổng hợp xử lý các giá trị null trong một cách khác với các hàm không tổng hợp:

select 2 + NULL + 5 

lợi nhuận NULL vì NULL trên bối cảnh này nó có nghĩa là một giá trị không rõ, vì vậy kết quả sẽ là NULL (chưa biết) cũng.

này sẽ trở lại 7 thay vì:

select SUM(n) 
from (
    select 2 as n 
    union all select null 
    union all select 5 
) s 

vì trên bối cảnh này một giá trị NULL, ngay cả khi nó là không rõ, có thể được xem như là một "giá trị không xác định".Lý do là nó rất phổ biến để sử dụng NULL như là một giá trị không được chỉ định và nó ít sử dụng pratical để bao gồm NULL trong một hàm tổng hợp, đó là lý do tại sao hàm tổng hợp được định nghĩa để bỏ qua NULL.

+0

Cảm ơn rất nhiều cách tốt đẹp để tách 'Tổng hợp' &' Không tổng hợp' ví dụ.Tôi muốn tôi có thể chấp nhận cả hai câu trả lời. , upvote –