使用 SQL 資料庫時,高效率的資料檢索和操作至關重要。一個常見的操作是對錶中的行進行計數,這可以使用COUNT
函數來完成。此函數的兩個常用變體是COUNT(*)
和COUNT(1)
。儘管乍一看它們似乎相同,但它們的用法存在細微的差異和含義。本文將深入探討這些差異,讓您清楚了解何時以及如何使用每個差異。
COUNT(*) :此函數計算表中的所有行,包括具有NULL
值的行。這是取得總行數最直接的方法。
COUNT(1) :此函數計算括號內表達式的值不為NULL
所有行。由於1
是常數且絕不為NULL
,因此它可以像COUNT(*)
一樣有效地計算所有行。
COUNT(*)
:計算表中的每一行,無論這些行中有什麼。
COUNT(1)
:計算表達式1
的值不為NULL
每一行。由於1
始終不為NULL
,因此它會計算所有行。
從歷史上看,某些資料庫系統可能以不同的方式優化這些查詢。然而,現代資料庫系統在效能方面對COUNT(*)
和COUNT(1)
處理類似。如果沒有WHERE
子句,它們都會導致全表掃描。
在大多數現代 RDBMS(包括 MySQL、PostgreSQL 和 SQL Server)中,效能差異可以忽略不計。這些系統的優化器了解這兩個查詢本質上要求的是同一件事:行數。
出於可讀性考慮,通常首選COUNT(*)
因為它清楚地表明了對所有行進行計數的意圖。對於閱讀程式碼的人來說更直觀。
有些開發人員可能會使用COUNT(1)
,他們知道它與COUNT(*)
等效,但由於個人或歷史原因而更喜歡它的出現。
在計算大型表中的行數時,擁有適當的索引可以顯著加快查詢速度。 COUNT(*)
和COUNT(1)
都可以從索引中受益。
如果資料列已建立索引且不包含NULL
值,則使用COUNT(column_name)
對特定資料列進行計數會更快。這是因為資料庫可以掃描索引而不是整個表。
COUNT(*)
和COUNT(1)
都可以與WHERE
子句一起使用。例如: SELECT COUNT(*) FROM employees WHERE department = 'Sales';
SELECT COUNT(1) FROM employees WHERE department = 'Sales';
COUNT(*)
和COUNT(1)
都是標準 SQL,所有主要關聯式資料庫系統都支援。選擇其中一個不會影響 SQL 程式碼的可移植性。總之,在大多數現代 SQL 資料庫中, COUNT(*)
和COUNT(1)
在功能上是等效的,都提供表格的總行數。雖然效能差異很小,但COUNT(*)
通常因其清晰性和可讀性而受到青睞。在編寫 SQL 查詢時,請理解這些微妙之處可以幫助您編寫更具可讀性和可維護性的程式碼,儘管在大多數情況下它不會對效能產生重大影響。
對於大多數情況,請使用COUNT(*)
來計算行數,除非根據您對資料庫最佳化器的理解或個人偏好有特定原因而偏好COUNT(1)
。始終考慮程式碼的可讀性和可維護性,因為未來的開發人員將欣賞清晰易懂的查詢。
透過選擇適當的COUNT
函數並有效地利用索引,您可以確保您的 SQL 查詢既高效又易於理解。
原文出處:https://dev.to/msnmongare/count-vs-count1-in-sql-understanding-the-differences-2j4d