數據庫Navicat for MySQL使用教程:如何在 MySQL 中獲取行計數(第 1 部分)

點擊下載Navicat for MySQL數據庫

有幾種方法能夠在 MySQL 中獲取行的總數。某些數據庫管理產品提供表大小等數據庫統計信息,但也能夠直接使用 SQL 來獲得。在今天的文章中,咱們將使用原生 COUNT() 函數來檢索 MySQL 數據庫中一個表或視圖中的行數。在第 2 部分中,咱們將學習如何從多個表中獲取行計數,甚至從數據庫中的全部表中獲取行計數。express

COUNT() 函數的多種形式併發

你可能已經知道 COUNT() 函數可用於返回表的行數。可是它還有更多用途,由於 COUNT() 函數可用於計算表中的全部行的個數或僅計算與特定條件匹配的行的個數。祕密在於函數簽名,其中有幾種形式:COUNT(*)、COUNT(expression) 和 COUNT(DISTINCT expression)。函數

在每種狀況,COUNT() 都返回一個 BIGINT,包含匹配行的數目,若是沒有找到匹配行則返回零。學習

計算表中全部行的個數url

若要計算表中的全部行,不管它們是否包含 NULL 值,請使用 COUNT(*)。這種形式的 COUNT() 函數基本上返回 SELECT 語句返回的結果集中的行數。.net

SELECT COUNT(*) FROM cities;code

如上所述的語句,調用 COUNT(*) 函數而沒有 WHERE 子句或其餘列,在 MyISAM 表上運行速度是很是快的,由於行數存儲在 information_schema 數據庫的 tables 表的 table_rows 列中。orm

對於 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(*) 能夠正常工做。

固然,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) 簽名以及如何從多個表中獲取行計數。

下載Navicat for MySQL便可當即體驗!

相關文章
相關標籤/搜索