Navicat 部落格

Null 值和 SQL Count() 函式 2021 年 10 月 25 日,由 Robert Gravelle 撰寫

早在 2020 年 3 月,關聯式資料庫系統中的 NULL 值及其用途一文就介紹了 NULL 值及其在關聯式資料庫中的特殊意義。那篇文章還描述了如何在資料庫資料表中允許 NULL 值,以及如何在査詢中引用它們。在今天的文章中,我們將學習如何將 NULL 與 SQL Count() 函式結合起來,以實現各種目標。

計算 Null 值和非 Null 值

Count() 函式有兩種形式:COUNT(*) 傳回資料表中的所有列,而 COUNT(Expression) 忽略 NULL 運算式。因此,如果提供允許 NULL 值的欄名稱,則 Count() 將傳回所有具有非 NULL 值的列。Count() 的這兩種不同用法提供了一條重要線索,說明如何獲得特定欄的 NULL 值計數。也就是說,從總數欄位中減去非 NULL 欄位數量,如下所示:

SELECT COUNT(*) - COUNT(<Column Name>)

現在我們知道了如何計算資料表中的 NULL 列、非 NULL 列和所有列,讓我們來看一個範例。我們將對 MySQL classicmodels 範例資料庫的 customers 資料表執行此査詢。以下是 Navicat Premium 資料表設計器中的資料表:

customer_table (113K)

addressline2 欄位包含不屬於街道名稱和編號的其他地址詳細資訊。因此,正如我們在這個資料表資料範例中所看到的,並非所有地址都需要它:

customer_table_2 (97K)

此査詢以三種方式使用 Count() 函式來顯示所有資料表列、有資料的 addressLine2 列數和 NULL 值列數:

SELECT COUNT(*) AS All_Rows,
       COUNT(addressLine2) AS addressLine2_Count, 
       COUNT(*) - COUNT(addressLine2) AS Null_addressLine2_Rows
FROM customers;

以下是 Navicat Premium 査詢設計器中的上述 SELECT 陳述式以及結果:

count_addressLine2 (54K)

正如預期的那樣,addressLine2_Count 和 Null_addressLine2_Rows 結果相加為 All_Rows 計數。

在內容分析中使用 NULL

COUNT() 函式的 COUNT(Expression) 版本忽略 NULL 運算式這一事實對於編譯有關資料表資料的統計資訊非常有幫助,特別是當與其他函式(如 SQL IF() 函式)結合使用時,它基本上是三元運算子的 SQL 等價物:

IF(predicate, true-value, false-value)

如果述詞為 true,則 IF 的計算結果為 true 值,或者在下面的査詢中為 1。如果述詞為 false,則其計算結果為 false 值或 NULL,如下面的陳述式所示。然後,COUNT 將 IF 計算為 1(即述詞為 true)的每一列製成表格:

SELECT count(IF(country = 'Australia', 1, NULL)) as Australia_Count, 
       count(IF(country = 'Germany', 1, NULL)) as Germany_Count, 
       count(IF(country = 'Canada' OR country = 'USA', 1, NULL)) as North_America_Count, 
       count(IF(country like 'F%', 1, NULL)) as F_Countries_Count, 
       count(IF(creditLimit between 20000 and 1000000, 1, NULL)) as CreditLimit_Range_Count, 
       count(*) as Total_Count
FROM customers
WHERE dob >= '1960-01-01';

以下是 Navicat 中的査詢和結果:

null_with_count_and_if_functions (78K)

總結

在今天的文章中,我們學習了如何將 Null 與 SQL Count() 函式結合起來,以實現各種目標。除了計算 NULL 值和非 NULL 值之外,當與其他 SQL 函式(如 IF() 和 SUM())結合使用時,這些函式還可以用於編譯資料的各種統計資訊!

Navicat 文章
頻道記錄
分享
部落格封存檔