早在 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 資料表設計器中的資料表:
addressline2 欄位包含不屬於街道名稱和編號的其他地址詳細資訊。因此,正如我們在這個資料表資料範例中所看到的,並非所有地址都需要它:
此査詢以三種方式使用 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 陳述式以及結果:
正如預期的那樣,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 與 SQL Count() 函式結合起來,以實現各種目標。除了計算 NULL 值和非 NULL 值之外,當與其他 SQL 函式(如 IF() 和 SUM())結合使用時,這些函式還可以用於編譯資料的各種統計資訊!