Navicat 部落格

2018 年 3 月 20 日,由 Robert Gravelle 撰寫

在 MySQL 中取得列的總數有幾種方法。某些資料庫管理產品提供資料表大小等資料庫統計資料,但也可以直接使用 SQL 來取得。在今天的文章中,我們將使用原生 COUNT() 函式來擷取 MySQL 資料庫中一個資料表或檢視的列數。在第 2 部分中,我們將學習如何從多個資料表甚至從資料庫中的所有資料表中取得列計數。

COUNT() 函式的多種形式

你可能已經知道 COUNT() 函式可用於傳回資料表的列數。但是它還有更多用途,因為 COUNT() 函式可用於計算資料表中的所有列的數目或只計算符合特定條件的列的數目。秘密在於函式簽章,其中有幾種形式:COUNT(*)、COUNT(expression) 和 COUNT(DISTINCT expression)。

在每種情況,COUNT() 都傳回一個 BIGINT,包含符合的列的數目,如果沒有找到符合的列則返回零。

計算資料表中所有列的數目

若要計算資料表中的所有列的數目,無論它們是否包含 NULL 值,請使用 COUNT(*)。這種形式的 COUNT() 函式基本上傳回 SELECT 語句傳回的結果集中的列數。

SELECT COUNT(*) FROM cities;

如上所述的語句,在沒有 WHERE 子句或其他欄的情況下調用 COUNT(*) 函式,在 MyISAM 資料表上執行速度是非常快的,因為列數儲存在 information_schema 資料庫的 tables 資料表的 table_rows 欄中。

對於 InnoDB 等交易型儲存引擎,儲存精確的列計數是不可能的,因為 InnoDB 不會在資料表中保留內部的列計數。如果是這樣,並行交易可能會同時「看到」不同數量的列。所以,SELECT COUNT(*) 語句只計算目前交易中看見的列的數目。這意味著在繁重的工作負載期間使用 COUNT(*) 執行查詢可能會導致查詢結果稍微有誤差。

使用 COUNT(expr) 只計算非 Null 列的數目

不傳遞任何東西給 COUNT() 會執行函式的 COUNT(expr) 版本,但沒有參數。以這種方式調用 COUNT() 僅傳回不包含 NULL 值的列。例如,假設我們有一個名為 code_values 的簡單資料表:

code_values
+-------+
| code  |
+-------+
| 1     |
+-------+
|       |
+-------+
|       |
+-------+
| 4     |
+-------+

即使資料表有 4 列,如使用 COUNT() 選取將返回結果 2:

SELECT COUNT(*) FROM code_values;

+---------+
| COUNT() |
+---------+
| 2       |
+---------+

請注意,此版本的 COUNT() 函式很少使用,因為 NULL 列不應該是正規化資料庫中的問題,這種情況只有在資料表沒有主索引鍵時才會發生。在大多數情況下,COUNT(*) 可以正常工作。

當然,C OUNT(expr) 接受正確的運算式。這是另一個取得 NULL 和非 NULL 列的查詢:

SELECT COUNT(IFNULL(code, 1)) FROM code_values;

計算非 Null 值的數目

COUNT 函式的 COUNT(expr) 版本也接受單個欄名稱,其效果是 COUNT(column_name) 將傳回 column_name 不是 NULL 的記錄數目。因此,以下 SELECT 查詢將取得 description 欄包含非 NULL 值的列數:

SELECT COUNT(description) FROM widgets;

在第 2 部分中,我們將學習如何使用 COUNT(DISTINCT expression) 簽章以及如何從多個資料表中取得得列計數。

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