SQL 中 COUNT 的用法示例詳解
1. COUNT(*)
:統(tǒng)計(jì)總行數(shù)
COUNT(*)
是 SQL 中最常用的統(tǒng)計(jì)方式之一。它會(huì)統(tǒng)計(jì)查詢結(jié)果集中所有行的數(shù)量(包括 NULL
值)。
語法:
SELECT COUNT(*) FROM 表名;
示例: 假設(shè)我們有一個(gè) employees
表,包含以下數(shù)據(jù):
id | name | age | department |
---|---|---|---|
1 | John Doe | 30 | Sales |
2 | Jane Smith | NULL | HR |
3 | Alice Brown | 25 | NULL |
執(zhí)行以下查詢:
SELECT COUNT(*) FROM employees;
結(jié)果:
3
解釋: COUNT(*)
會(huì)統(tǒng)計(jì)所有行,不會(huì)忽略 NULL
值,即使某些列有 NULL
,它也會(huì)計(jì)算每一行。因此,結(jié)果為 3
,表示表中共有 3 行數(shù)據(jù)。
2. COUNT(1)
:統(tǒng)計(jì)總行數(shù)
COUNT(1)
的作用與 COUNT(*)
類似,也會(huì)統(tǒng)計(jì)表中所有的行。它是 SQL 優(yōu)化中的一個(gè)小技巧,某些數(shù)據(jù)庫系統(tǒng)(如 MySQL)會(huì)對其進(jìn)行優(yōu)化處理。
語法:
SELECT COUNT(1) FROM 表名;
解釋: COUNT(1)
和 COUNT(*)
的結(jié)果是相同的,都會(huì)返回表中所有行的數(shù)量。數(shù)據(jù)庫會(huì)將 1
替代成一個(gè)常量來參與計(jì)算,并且不會(huì)關(guān)心每一列的具體值。
優(yōu)化區(qū)別: 在某些數(shù)據(jù)庫系統(tǒng)(如 MySQL)中,COUNT(1)
和 COUNT(*)
在執(zhí)行計(jì)劃中的表現(xiàn)可能相同,查詢效率基本沒有區(qū)別。然而,某些舊版的數(shù)據(jù)庫系統(tǒng)在處理 COUNT(*)
時(shí),會(huì)去解析整行數(shù)據(jù),而 COUNT(1)
可以直接統(tǒng)計(jì)行數(shù),因此會(huì)有一些微小的性能差異。
3. COUNT(列名)
:統(tǒng)計(jì)特定列中非 NULL 值的數(shù)量
與 COUNT(*)
不同,COUNT(列名)
只會(huì)統(tǒng)計(jì)指定列中非 NULL 值的數(shù)量。如果某列中有 NULL
值,COUNT(列名)
會(huì)自動(dòng)跳過它們。
語法:
SELECT COUNT(列名) FROM 表名;
示例:
SELECT COUNT(age) FROM employees;
結(jié)果
2
4. COUNT(DISTINCT 列名)
:統(tǒng)計(jì)某列中不重復(fù)的非 NULL 值的數(shù)量
有時(shí),我們不僅需要統(tǒng)計(jì)某列中的非 NULL 值,還需要統(tǒng)計(jì)不重復(fù)的值。在這種情況下,可以使用 COUNT(DISTINCT 列名)
來完成這個(gè)任務(wù)。
語法:
SELECT COUNT(DISTINCT 列名) FROM 表名;
示例: 假設(shè)我們有以下表數(shù)據(jù):
id | department |
---|---|
1 | Sales |
2 | HR |
3 | Sales |
4 | IT |
查詢:
SELECT COUNT(DISTINCT department) FROM employees;
結(jié)果:
3
解釋: 表中有三個(gè)不重復(fù)的 department
值:Sales
, HR
, IT
。因此,COUNT(DISTINCT department)
返回 3,表示有 3 個(gè)不同的部門。
5. COUNT()
與 GROUP BY
的結(jié)合
COUNT()
函數(shù)經(jīng)常和 GROUP BY
子句結(jié)合使用,用于統(tǒng)計(jì)每個(gè)分組的數(shù)量。GROUP BY
按照某列對數(shù)據(jù)進(jìn)行分組,COUNT()
則對每個(gè)分組內(nèi)的行數(shù)進(jìn)行統(tǒng)計(jì)。
6. COUNT
與 HAVING
的結(jié)合
HAVING
子句通常與 GROUP BY
一起使用,用來過濾聚合結(jié)果。它可以用來限制返回的分組數(shù)量,條件可以基于 COUNT()
等聚合函數(shù)的結(jié)果。
7. COUNT
與 JOIN
的結(jié)合
在復(fù)雜的查詢中,COUNT()
函數(shù)可以與 JOIN
子句一起使用,統(tǒng)計(jì)與另一個(gè)表匹配的記錄數(shù)量。
示例:
SELECT d.department, COUNT(e.id) FROM departments d LEFT JOIN employees e ON d.id = e.department_id GROUP BY d.department;
解釋: 此查詢會(huì)返回每個(gè)部門中員工的數(shù)量,即使某些部門沒有員工,也會(huì)返回該部門的記錄(因?yàn)槭褂昧?LEFT JOIN
)。使用 COUNT(e.id)
統(tǒng)計(jì)每個(gè)部門中關(guān)聯(lián)的員工數(shù)量。
COUNT(*)
和 COUNT(1)
的區(qū)別
區(qū)別:
- 在大多數(shù)數(shù)據(jù)庫系統(tǒng)中,
COUNT(*)
和COUNT(1)
的性能幾乎相同。COUNT(*)
會(huì)統(tǒng)計(jì)表中所有行,而不關(guān)心列內(nèi)容,而COUNT(1)
則是將1
作為一個(gè)固定值用于統(tǒng)計(jì)。 - 在某些數(shù)據(jù)庫系統(tǒng)中,
COUNT(1)
被認(rèn)為稍微高效一點(diǎn),因?yàn)樗恍枰馕鏊辛?,只是使用常?1
來計(jì)數(shù)。
結(jié)論: 現(xiàn)代數(shù)據(jù)庫(如 MySQL)會(huì)對 COUNT(*)
和 COUNT(1)
做優(yōu)化處理,因此二者的性能差異幾乎可以忽略。選擇哪種方式可以根據(jù)個(gè)人習(xí)慣或項(xiàng)目規(guī)范。
總結(jié)
COUNT(*)
:統(tǒng)計(jì)表中所有行,包括NULL
值。COUNT(1)
:與COUNT(*)
類似,統(tǒng)計(jì)所有行。COUNT(列名)
:統(tǒng)計(jì)某列中非NULL
值的數(shù)量。COUNT(DISTINCT 列名)
:統(tǒng)計(jì)某列中不重復(fù)的非NULL
值。COUNT
可與GROUP BY
和HAVING
等子句結(jié)合,進(jìn)行復(fù)雜的分組統(tǒng)計(jì)和條件過濾。COUNT(*)
和COUNT(1)
在大多數(shù)數(shù)據(jù)庫中性能相同,可以按習(xí)慣使用。
到此這篇關(guān)于SQL 中 COUNT 的用法示例詳解的文章就介紹到這了,更多相關(guān)sql count用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- mysql count(*)分組之后IFNULL無效問題
- Sql根據(jù)不同條件統(tǒng)計(jì)總數(shù)的方法(count和sum)
- SQL中count(1)、count(*)?與?count(列名)的區(qū)別詳細(xì)解釋
- MySQL數(shù)據(jù)庫統(tǒng)計(jì)函數(shù)COUNT的使用及說明
- mysql?count()函數(shù)不計(jì)算null和空值問題
- mysql數(shù)據(jù)庫之count()函數(shù)和sum()函數(shù)用法及區(qū)別說明
- mysql一條sql查出多個(gè)條件不同的sum或count問題
- MySQL中的count(*)?和?count(1)?區(qū)別性能對比分析
相關(guān)文章
SQL Server中數(shù)據(jù)類型轉(zhuǎn)換的原理、使用方法、常見場景示例講解
在SQLServer中,數(shù)據(jù)類型轉(zhuǎn)換包含隱式轉(zhuǎn)換和顯式轉(zhuǎn)換兩種方式,隱式轉(zhuǎn)換由系統(tǒng)自動(dòng)完成,而顯式轉(zhuǎn)換需要使用CAST或CONVERT函數(shù),本文詳細(xì)講解了數(shù)據(jù)類型轉(zhuǎn)換的原理、使用方法和常見場景,并提供了具體示例,同時(shí),介紹了錯(cuò)誤處理函數(shù)TRY_CAST和TRY_CONVERT2024-09-09SQL Server 2005 數(shù)據(jù)庫轉(zhuǎn) SQL Server 2000的方法小結(jié)
這篇文章主要介紹了SQL Server 2005 數(shù)據(jù)庫轉(zhuǎn) SQL Server 2000的方法,需要的朋友可以參考下2014-04-04SQL?Server數(shù)據(jù)庫備份和恢復(fù)數(shù)據(jù)庫的全過程
最近在功能調(diào)試前需要先將測試數(shù)據(jù)庫備份,然后功能調(diào)試之后再將測試數(shù)據(jù)庫還原,這樣就可以重復(fù)的進(jìn)行功能調(diào)試,這篇文章主要給大家介紹了關(guān)于SQL?Server數(shù)據(jù)庫備份和恢復(fù)數(shù)據(jù)庫的相關(guān)資料,需要的朋友可以參考下2022-06-06關(guān)于SQL 存儲(chǔ)過程入門基礎(chǔ)(基礎(chǔ)知識)
本篇文章,小編將為大家介紹關(guān)于SQL 存儲(chǔ)過程入門基礎(chǔ)(基礎(chǔ)知識),有需要的朋友可以參考一下2013-04-04SQL Server數(shù)據(jù)庫基本概念、組成、常用對象與約束
這篇文章介紹了SQL Server數(shù)據(jù)庫的基本概念、組成、常用對象與約束,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-03-03一步步教你建立SQL數(shù)據(jù)庫的表分區(qū)
分區(qū)存儲(chǔ)提高了數(shù)據(jù)庫的性能,被分區(qū)存儲(chǔ)的數(shù)據(jù)物理上是多個(gè)文件,但邏輯上任然是一個(gè)表,對表的任何操作都跟沒分區(qū)之前一樣。插入、刪除、查詢、更新等操作的時(shí)候,數(shù)據(jù)庫會(huì)自動(dòng)為你找到對應(yīng)的分區(qū),然后執(zhí)行操作。2015-09-09