轉帖|使用教程|編輯:鮑佳佳|2021-03-25 11:29:35.893|閱讀 334 次
概述:有幾種方法可以在 MySQL 中獲取行的總數。某些數據庫管理產品提供表大小等數據庫統計信息,但也可以直接使用 SQL 來得到。在今天的文章中,我們將使用原生 COUNT() 函數來檢索 MySQL 數據庫中一個表或視圖中的行數。在第 2 部分中,我們將學習如何從多個表中獲取行計數,甚至從數據庫中的所有表中獲取行計數。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
有幾種方法可以在 MySQL 中獲取行的總數。某些數據庫管理產品提供表大小等數據庫統計信息,但也可以直接使用 SQL 來得到。在今天的文章中,我們將使用原生 COUNT() 函數來檢索 MySQL 數據庫中一個表或視圖中的行數。在第 2 部分中,我們將學習如何從多個表中獲取行計數,甚至從數據庫中的所有表中獲取行計數。
COUNT() 函數的多種形式
你可能已經知道 COUNT() 函數可用于返回表的行數。但是它還有更多用途,因為 COUNT() 函數可用于計算表中的所有行的個數或僅計算與特定條件匹配的行的個數。秘密在于函數簽名,其中有幾種形式:COUNT(*)、COUNT(expression) 和 COUNT(DISTINCT expression)。
在每種情況,COUNT() 都返回一個 BIGINT,包含匹配行的數目,如果沒有找到匹配行則返回零。
計算表中所有行的個數
若要計算表中的所有行,無論它們是否包含 NULL 值,請使用 COUNT(*)。這種形式的 COUNT() 函數基本上返回 SELECT 語句返回的結果集中的行數。
SELECT COUNT(*) FROM cities;如上所述的語句,調用 COUNT(*) 函數而沒有 WHERE 子句或其他列,在 MyISAM 表上運行速度是非常快的,因為行數存儲在 information_schema 數據庫的 tables 表的 table_rows 列中。
對于 InnoDB 等事務存儲引擎,存儲精確的行計數是有不可能的,因為 InnoDB 不會在表中保留內部行計數。如果是這樣,并發事務可能會同時“看到”不同數量的行。所以,SELECT COUNT(*) 語句只計算當前事務可見的行的個數。這意味著在繁重的工作負載期間使用 COUNT(*) 運行查詢可能會導致查詢結果稍微不準確。
使用 COUNT(expr) 僅計數非 Null 行的個數
什么都不傳遞給 COUNT() 會執行函數的 COUNT(expr) 版本,但沒有參數。以這種方式調用 COUNT() 僅返回不包含 NULL 值的行。例如,假設我們有一個名為 code_values 的簡單表:
code_values即使有 4 行,從表中以 COUNT() 選擇將返回結果 2:
SELECT COUNT(*) FROM code_values;
+---------+
| COUNT() |
+---------+
| 2 |
+---------+
請注意,此版本的 COUNT() 函數很少使用,因為 NULL 行不應該是規范化數據庫中的問題,這種情況只有在表沒有主鍵時才會發生。在大多數情況下,COUNT(*) 可以正常工作。
當然,COUNT(expr) 接受適當的表達式。這是另一個獲取 NULL 和非 NULL 行的查詢:
SELECT COUNT(IFNULL(code, 1)) FROM code_values;計算非 Null 值的個數
COUNT 函數的 COUNT(expr) 版本也接受單個列名,其效果是 COUNT(column_name) 將返回 column_name name 不是 NULL 的記錄數。因此,以下 SELECT 查詢將獲取 description 列包含非 NULL 值的行數:
SELECT COUNT(description) FROM widgets;在第 2 部分中,我們將學習如何使用 COUNT(DISTINCT expression) 簽名以及如何從多個表中獲取行計數。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自: